diff --git a/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/schema/AvroSchemaHelper.java b/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/schema/AvroSchemaHelper.java index e7449dbe3..a35bea8e0 100644 --- a/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/schema/AvroSchemaHelper.java +++ b/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/schema/AvroSchemaHelper.java @@ -7,6 +7,7 @@ import java.net.URL; import java.util.*; +import org.apache.avro.JsonProperties; import org.apache.avro.Schema; import org.apache.avro.Schema.Parser; import org.apache.avro.reflect.AvroAlias; @@ -360,10 +361,18 @@ public static String getFullName(Schema schema) { } } + public static JsonNode nullNode() { + return DEFAULT_VALUE_MAPPER.nullNode(); + } + /** * @since 2.11 */ public static JsonNode objectToJsonNode(Object defaultValue) { + if (defaultValue == JsonProperties.NULL_VALUE) { + return nullNode(); + } + return DEFAULT_VALUE_MAPPER.convertValue(defaultValue, JsonNode.class); } @@ -371,6 +380,14 @@ public static JsonNode objectToJsonNode(Object defaultValue) { * @since 2.11 */ public static Object jsonNodeToObject(JsonNode defaultJsonValue) { + if (defaultJsonValue == null) { + return null; + } + + if (defaultJsonValue.isNull()) { + return JsonProperties.NULL_VALUE; + } + return DEFAULT_VALUE_MAPPER.convertValue(defaultJsonValue, Object.class); } diff --git a/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/schema/AvroSchemaHelperTest.java b/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/schema/AvroSchemaHelperTest.java new file mode 100644 index 000000000..bde4b8be9 --- /dev/null +++ b/avro/src/test/java/com/fasterxml/jackson/dataformat/avro/schema/AvroSchemaHelperTest.java @@ -0,0 +1,28 @@ +package com.fasterxml.jackson.dataformat.avro.schema; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import static com.fasterxml.jackson.dataformat.avro.schema.AvroSchemaHelper.jsonNodeToObject; +import static com.fasterxml.jackson.dataformat.avro.schema.AvroSchemaHelper.objectToJsonNode; +import junit.framework.TestCase; +import org.apache.avro.JsonProperties; + +public class AvroSchemaHelperTest extends TestCase { + private static final JsonNodeFactory NODE_FACTORY = new ObjectMapper().getNodeFactory(); + + public void testObjectToJsonNode() { + assertEquals(NODE_FACTORY.nullNode(), objectToJsonNode(null)); + assertEquals(NODE_FACTORY.nullNode(), objectToJsonNode(JsonProperties.NULL_VALUE)); + assertEquals(NODE_FACTORY.booleanNode(true), objectToJsonNode(true)); + assertEquals(NODE_FACTORY.booleanNode(false), objectToJsonNode(false)); + assertEquals(NODE_FACTORY.textNode("foo"), objectToJsonNode("foo")); + } + + public void testJsonNodeToObject() { + assertNull(jsonNodeToObject(null)); + assertEquals(JsonProperties.NULL_VALUE, jsonNodeToObject(NODE_FACTORY.nullNode())); + assertEquals(true, jsonNodeToObject(NODE_FACTORY.booleanNode(true))); + assertEquals(false, jsonNodeToObject(NODE_FACTORY.booleanNode(false))); + assertEquals("foo", jsonNodeToObject(NODE_FACTORY.textNode("foo"))); + } +} \ No newline at end of file