package com.fasterxml.jackson.databind.deser.merge; import com.fasterxml.jackson.annotation.JsonMerge; import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.ArrayNode; public class NodeMergeTest extends BaseMapTest { private final static ObjectMapper MAPPER = newObjectMapper() // 26-Oct-2016, tatu: Make sure we'll report merge problems by default .disable(MapperFeature.IGNORE_MERGE_FOR_UNMERGEABLE) ; static class ObjectNodeWrapper { @JsonMerge public ObjectNode props = MAPPER.createObjectNode(); { props.put("default", "enabled"); } } static class ArrayNodeWrapper { @JsonMerge public ArrayNode list = MAPPER.createArrayNode(); { list.add(123); } } /* /******************************************************** /* Test methods /******************************************************** */ public void testObjectNodeUpdateValue() throws Exception { ObjectNode base = MAPPER.createObjectNode(); base.put("first", "foo"); assertSame(base, MAPPER.readerForUpdating(base) .readValue(aposToQuotes("{'second':'bar', 'third':5, 'fourth':true}"))); assertEquals(4, base.size()); assertEquals("bar", base.path("second").asText()); assertEquals("foo", base.path("first").asText()); assertEquals(5, base.path("third").asInt()); assertTrue(base.path("fourth").asBoolean()); } public void testObjectNodeMerge() throws Exception { ObjectNodeWrapper w = MAPPER.readValue(aposToQuotes("{'props':{'stuff':'xyz'}}"), ObjectNodeWrapper.class); assertEquals(2, w.props.size()); assertEquals("enabled", w.props.path("default").asText()); assertEquals("xyz", w.props.path("stuff").asText()); } public void testObjectDeepUpdate() throws Exception { ObjectNode base = MAPPER.createObjectNode(); ObjectNode props = base.putObject("props"); props.put("base", 123); props.put("value", 456); ArrayNode a = props.putArray("array"); a.add(true); base.putNull("misc"); assertSame(base, MAPPER.readerForUpdating(base) .readValue(aposToQuotes( "{'props':{'value':true, 'extra':25.5, 'array' : [ 3 ]}}"))); assertEquals(2, base.size()); ObjectNode resultProps = (ObjectNode) base.get("props"); assertEquals(4, resultProps.size()); assertEquals(123, resultProps.path("base").asInt()); assertTrue(resultProps.path("value").asBoolean()); assertEquals(25.5, resultProps.path("extra").asDouble()); JsonNode n = resultProps.get("array"); assertEquals(ArrayNode.class, n.getClass()); assertEquals(2, n.size()); assertEquals(3, n.get(1).asInt()); } public void testArrayNodeUpdateValue() throws Exception { ArrayNode base = MAPPER.createArrayNode(); base.add("first"); assertSame(base, MAPPER.readerForUpdating(base) .readValue(aposToQuotes("['second',false,null]"))); assertEquals(4, base.size()); assertEquals("first", base.path(0).asText()); assertEquals("second", base.path(1).asText()); assertFalse(base.path(2).asBoolean()); assertTrue(base.path(3).isNull()); } public void testArrayNodeMerge() throws Exception { ArrayNodeWrapper w = MAPPER.readValue(aposToQuotes("{'list':[456,true,{}, [], 'foo']}"), ArrayNodeWrapper.class); assertEquals(6, w.list.size()); assertEquals(123, w.list.get(0).asInt()); assertEquals(456, w.list.get(1).asInt()); assertTrue(w.list.get(2).asBoolean()); JsonNode n = w.list.get(3); assertTrue(n.isObject()); assertEquals(0, n.size()); n = w.list.get(4); assertTrue(n.isArray()); assertEquals(0, n.size()); assertEquals("foo", w.list.get(5).asText()); } }