package alien4cloud.utils; import java.io.IOException; import java.util.Map; import lombok.*; import org.elasticsearch.common.collect.Maps; import org.junit.Assert; import org.junit.Test; import alien4cloud.utils.jackson.ConditionalAttributes; import alien4cloud.utils.jackson.ConditionalOnAttribute; import alien4cloud.utils.jackson.JSonMapEntryArrayDeSerializer; import alien4cloud.utils.jackson.JSonMapEntryArraySerializer; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; public class JSonMapEntryArraySerializerTest { @Test public void serializationWithDefaultContextShouldNotSerializeToArray() throws JsonProcessingException { TestObject testObject = new TestObject(); testObject.map.put("key1", new InnerObject("innerStr1", 1)); ObjectMapper mapper = new ObjectMapper(); String str = mapper.writeValueAsString(testObject); Assert.assertEquals("{\"map\":{\"key1\":{\"str\":\"innerStr1\",\"integer\":1}}}", str); } @Test public void deserializationWithDefaultContext() throws IOException { TestObject testObject = new TestObject(); testObject.map.put("key1", new InnerObject("innerStr1", 1)); ObjectMapper mapper = new ObjectMapper(); String str = mapper.writeValueAsString(testObject); TestObject readObject = mapper.readValue(str, TestObject.class); Assert.assertEquals(testObject, readObject); } @Test public void serializationWithMapContextShouldSerializeToArray() throws JsonProcessingException { TestObject testObject = new TestObject(); testObject.map.put("key1", new InnerObject("innerStr1", 1)); MapRestMapper mapper = new MapRestMapper(); String str = mapper.writeValueAsString(testObject); Assert.assertEquals("{\"map\":[{\"key\":\"key1\",\"value\":{\"str\":\"innerStr1\",\"integer\":1}}]}", str); } @Test public void deserializationWithMapContext() throws IOException { TestObject testObject = new TestObject(); testObject.map.put("key1", new InnerObject("innerStr1", 1)); MapRestMapper mapper = new MapRestMapper(); String str = mapper.writeValueAsString(testObject); TestObject readObject = mapper.readValue(str, TestObject.class); Assert.assertEquals(testObject, readObject); } @Getter @Setter @EqualsAndHashCode public static class TestObject { @ConditionalOnAttribute(ConditionalAttributes.REST) @JsonDeserialize(using = JSonMapEntryArrayDeSerializer.class) @JsonSerialize(using = JSonMapEntryArraySerializer.class) private Map<String, InnerObject> map = Maps.newHashMap(); } @Getter @Setter @EqualsAndHashCode @NoArgsConstructor @AllArgsConstructor(suppressConstructorProperties = true) public static class InnerObject { private String str; private Integer integer; } public static class MapRestMapper extends ObjectMapper { private static final long serialVersionUID = 1L; public MapRestMapper() { super(); this._serializationConfig = this._serializationConfig.withAttribute(ConditionalAttributes.REST, "true"); this._deserializationConfig = this._deserializationConfig.withAttribute(ConditionalAttributes.REST, "true"); } } }