Skip to content

Commit 267de5f

Browse files
marcospassoscowtowncoder
authored andcommitted
Fix serialization of Avro null values
1 parent 53e21f7 commit 267de5f

File tree

2 files changed

+45
-0
lines changed

2 files changed

+45
-0
lines changed

avro/src/main/java/com/fasterxml/jackson/dataformat/avro/schema/AvroSchemaHelper.java

+17
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.net.URL;
88
import java.util.*;
99

10+
import org.apache.avro.JsonProperties;
1011
import org.apache.avro.Schema;
1112
import org.apache.avro.Schema.Parser;
1213
import org.apache.avro.reflect.AvroAlias;
@@ -360,17 +361,33 @@ public static String getFullName(Schema schema) {
360361
}
361362
}
362363

364+
public static JsonNode nullNode() {
365+
return DEFAULT_VALUE_MAPPER.nullNode();
366+
}
367+
363368
/**
364369
* @since 2.11
365370
*/
366371
public static JsonNode objectToJsonNode(Object defaultValue) {
372+
if (defaultValue == JsonProperties.NULL_VALUE) {
373+
return nullNode();
374+
}
375+
367376
return DEFAULT_VALUE_MAPPER.convertValue(defaultValue, JsonNode.class);
368377
}
369378

370379
/**
371380
* @since 2.11
372381
*/
373382
public static Object jsonNodeToObject(JsonNode defaultJsonValue) {
383+
if (defaultJsonValue == null) {
384+
return null;
385+
}
386+
387+
if (defaultJsonValue.isNull()) {
388+
return JsonProperties.NULL_VALUE;
389+
}
390+
374391
return DEFAULT_VALUE_MAPPER.convertValue(defaultJsonValue, Object.class);
375392
}
376393

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.fasterxml.jackson.dataformat.avro.schema;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
5+
import static com.fasterxml.jackson.dataformat.avro.schema.AvroSchemaHelper.jsonNodeToObject;
6+
import static com.fasterxml.jackson.dataformat.avro.schema.AvroSchemaHelper.objectToJsonNode;
7+
import junit.framework.TestCase;
8+
import org.apache.avro.JsonProperties;
9+
10+
public class AvroSchemaHelperTest extends TestCase {
11+
private static final JsonNodeFactory NODE_FACTORY = new ObjectMapper().getNodeFactory();
12+
13+
public void testObjectToJsonNode() {
14+
assertEquals(NODE_FACTORY.nullNode(), objectToJsonNode(null));
15+
assertEquals(NODE_FACTORY.nullNode(), objectToJsonNode(JsonProperties.NULL_VALUE));
16+
assertEquals(NODE_FACTORY.booleanNode(true), objectToJsonNode(true));
17+
assertEquals(NODE_FACTORY.booleanNode(false), objectToJsonNode(false));
18+
assertEquals(NODE_FACTORY.textNode("foo"), objectToJsonNode("foo"));
19+
}
20+
21+
public void testJsonNodeToObject() {
22+
assertNull(jsonNodeToObject(null));
23+
assertEquals(JsonProperties.NULL_VALUE, jsonNodeToObject(NODE_FACTORY.nullNode()));
24+
assertEquals(true, jsonNodeToObject(NODE_FACTORY.booleanNode(true)));
25+
assertEquals(false, jsonNodeToObject(NODE_FACTORY.booleanNode(false)));
26+
assertEquals("foo", jsonNodeToObject(NODE_FACTORY.textNode("foo")));
27+
}
28+
}

0 commit comments

Comments
 (0)