From cdef1cd58863c98140f0a62a37a84e489e16343a Mon Sep 17 00:00:00 2001 From: Taylor Jones Date: Wed, 4 Jul 2018 23:42:17 -0400 Subject: [PATCH] Adding support for Jackson JsonNode --- .../monitorjbl/json/JsonViewSerializer.java | 4 ++ .../json/JsonViewSerializerTest.java | 46 +++++++++++++++++++ .../com/monitorjbl/json/model/TestObject.java | 10 ++++ 3 files changed, 60 insertions(+) diff --git a/json-view/src/main/java/com/monitorjbl/json/JsonViewSerializer.java b/json-view/src/main/java/com/monitorjbl/json/JsonViewSerializer.java index b07ab78..ae7b776 100644 --- a/json-view/src/main/java/com/monitorjbl/json/JsonViewSerializer.java +++ b/json-view/src/main/java/com/monitorjbl/json/JsonViewSerializer.java @@ -9,6 +9,7 @@ import com.fasterxml.jackson.annotation.JsonManagedReference; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.annotation.JsonSerialize; @@ -342,6 +343,9 @@ void writeObject(Object obj) throws IOException { } else { new JsonWriter(jgen, result, currentMatch, currentPath, path, property, serializerProvider).write(name, val); } + } else if(val instanceof JsonNode) { + // Let Jackson deal with these, they're special + serializerProvider.defaultSerializeValue(val, jgen); } else { new JsonWriter(jgen, result, currentMatch, currentPath, path, property, serializerProvider).write(name, val); } diff --git a/json-view/src/test/java/com/monitorjbl/json/JsonViewSerializerTest.java b/json-view/src/test/java/com/monitorjbl/json/JsonViewSerializerTest.java index 08d5227..6d64099 100644 --- a/json-view/src/test/java/com/monitorjbl/json/JsonViewSerializerTest.java +++ b/json-view/src/test/java/com/monitorjbl/json/JsonViewSerializerTest.java @@ -3,6 +3,10 @@ import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.NullNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.fasterxml.jackson.databind.node.TextNode; import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.module.paramnames.ParameterNamesModule; @@ -1090,4 +1094,46 @@ public void testSerializationOrder() throws Exception { assertEquals("date", keys.get(4)); } + @Test + public void testJacksonJsonNodeSupport_object() throws Exception { + TestObject ref = new TestObject(); + ObjectNode node1 = sut.createObjectNode(); + ObjectNode node2 = sut.createObjectNode(); + node2.set("stringfield", new TextNode("hello")); + node1.set("jacksonObject", node2); + ref.setJsonNode(node1); + + String serialized = sut.writeValueAsString(JsonView.with(ref)); + Map obj = sut.readValue(serialized, LinkedHashMap.class); + + assertNotNull(obj.get("jsonNode")); + assertTrue(obj.get("jsonNode") instanceof Map); + + Map jsonNode = (Map) obj.get("jsonNode"); + assertTrue(jsonNode.get("jacksonObject") instanceof Map); + assertEquals("hello", ((Map) jsonNode.get("jacksonObject")).get("stringfield")); + } + + @Test + public void testJacksonJsonNodeSupport_textNode() throws Exception { + TestObject ref = new TestObject(); + ref.setJsonNode(new TextNode("asdf")); + + String serialized = sut.writeValueAsString(JsonView.with(ref)); + Map obj = sut.readValue(serialized, LinkedHashMap.class); + + assertEquals(obj.get("jsonNode"), "asdf"); + } + + @Test + public void testJacksonJsonNodeSupport_nullNode() throws Exception { + TestObject ref = new TestObject(); + ref.setJsonNode(NullNode.getInstance()); + + String serialized = sut.writeValueAsString(JsonView.with(ref)); + Map obj = sut.readValue(serialized, LinkedHashMap.class); + + assertNull(obj.get("jsonNode")); + } + } diff --git a/json-view/src/test/java/com/monitorjbl/json/model/TestObject.java b/json-view/src/test/java/com/monitorjbl/json/model/TestObject.java index 214b9e5..b37349a 100644 --- a/json-view/src/test/java/com/monitorjbl/json/model/TestObject.java +++ b/json-view/src/test/java/com/monitorjbl/json/model/TestObject.java @@ -5,6 +5,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.math.BigDecimal; @@ -60,6 +61,7 @@ public enum TestEnum {VALUE_A, VALUE_B} private String jsonPropNoValue; private UUID uuid; private TestObject recursion; + private JsonNode jsonNode; public String getStr1() { return str1; @@ -301,6 +303,14 @@ public void setRecursion(TestObject recursion) { this.recursion = recursion; } + public JsonNode getJsonNode() { + return jsonNode; + } + + public void setJsonNode(JsonNode jsonNode) { + this.jsonNode = jsonNode; + } + public String getStaticValue() { return "TEST"; }