diff --git a/lang/java/avro/src/main/java/org/apache/avro/util/internal/JacksonUtils.java b/lang/java/avro/src/main/java/org/apache/avro/util/internal/JacksonUtils.java index 29593fba092..21df8369022 100644 --- a/lang/java/avro/src/main/java/org/apache/avro/util/internal/JacksonUtils.java +++ b/lang/java/avro/src/main/java/org/apache/avro/util/internal/JacksonUtils.java @@ -115,7 +115,11 @@ public static Object toObject(JsonNode jsonNode) { public static Object toObject(JsonNode jsonNode, Schema schema) { if (schema != null && schema.getType().equals(Schema.Type.UNION)) { - return toObject(jsonNode, schema.getTypes().get(0)); + if (schema.getTypes().get(0).getType() != (Schema.Type.NULL)) { + return toObject(jsonNode, schema.getTypes().get(0)); + } else { + return toObject(jsonNode, schema.getTypes().get(1)); + } } if (jsonNode == null) { return null; diff --git a/lang/java/avro/src/test/java/org/apache/avro/util/internal/TestJacksonUtils.java b/lang/java/avro/src/test/java/org/apache/avro/util/internal/TestJacksonUtils.java index cd6fe3f74da..d00a4955d47 100644 --- a/lang/java/avro/src/test/java/org/apache/avro/util/internal/TestJacksonUtils.java +++ b/lang/java/avro/src/test/java/org/apache/avro/util/internal/TestJacksonUtils.java @@ -79,6 +79,10 @@ void testToObject() { assertEquals(1, toObject(IntNode.valueOf(1))); assertEquals(2L, toObject(IntNode.valueOf(2), Schema.create(Schema.Type.LONG))); assertEquals(1.0f, toObject(DoubleNode.valueOf(1.0), Schema.create(Schema.Type.FLOAT))); + assertEquals(1.1f, toObject(DoubleNode.valueOf(1.1), + Schema.createUnion(Schema.create(Schema.Type.NULL), Schema.create(Schema.Type.FLOAT)))); + assertEquals(1.2f, toObject(DoubleNode.valueOf(1.2), + Schema.createUnion(Schema.create(Schema.Type.FLOAT), Schema.create(Schema.Type.NULL)))); assertEquals(2.0, toObject(DoubleNode.valueOf(2.0))); assertEquals(TextNode.valueOf("\u0001\u0002"), toJsonNode(new byte[] { 1, 2 })); assertArrayEquals(new byte[] { 1, 2 }, @@ -90,6 +94,15 @@ void testToObject() { an.add(1); assertEquals(Collections.singletonList(1), toObject(an)); + assertEquals(Collections.singletonList(1), toObject(an, Schema.createUnion(Schema.create(Schema.Type.NULL), + Schema.createArray(Schema.createUnion(Schema.create(Schema.Type.NULL), Schema.create(Schema.Type.INT)))))); + + assertEquals(Collections.singletonList(1), + toObject(an, + Schema.createUnion( + Schema.createArray(Schema.createUnion(Schema.create(Schema.Type.INT), Schema.create(Schema.Type.NULL))), + Schema.create(Schema.Type.NULL)))); + ObjectNode on = JsonNodeFactory.instance.objectNode(); on.put("a", 1); assertEquals(Collections.singletonMap("a", 1), toObject(on));