From 0cac196cb4088752e40a36aee1e8709f1a091cc9 Mon Sep 17 00:00:00 2001 From: Zachary Payne Date: Mon, 23 Mar 2026 10:20:28 -0400 Subject: [PATCH] AVRO-4211: Java fix schema generation for union fields with default value that isn't the first union element --- .../avro/util/internal/JacksonUtils.java | 22 ++++++++++++++----- .../avro/util/internal/TestJacksonUtils.java | 5 +++++ 2 files changed, 22 insertions(+), 5 deletions(-) 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..c085997aab8 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 @@ -114,14 +114,26 @@ 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 (jsonNode == null) { return null; } else if (jsonNode.isNull()) { return JsonProperties.NULL_VALUE; - } else if (jsonNode.isBoolean()) { + } + + if (schema != null && schema.getType().equals(Schema.Type.UNION)) { + for (Schema unionType : schema.getTypes()) { + if (unionType.getType().equals(Schema.Type.NULL)) { + continue; + } + Object unionObject = toObject(jsonNode, unionType); + if (unionObject != null) { + return unionObject; + } + } + return null; + } + + if (jsonNode.isBoolean()) { return jsonNode.asBoolean(); } else if (jsonNode.isInt()) { if (schema == null || schema.getType().equals(Schema.Type.INT)) { @@ -187,7 +199,7 @@ public static Object toObject(JsonNode jsonNode, Schema schema) { /** * Convert an object into a map - * + * * @param datum The object * @return Its Map representation */ 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..314685f43da 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 @@ -100,6 +100,11 @@ void testToObject() { toObject(NullNode.getInstance(), SchemaBuilder.unionOf().nullType().and().intType().endUnion())); assertEquals("a", toObject(TextNode.valueOf("a"), SchemaBuilder.unionOf().stringType().and().intType().endUnion())); + + assertEquals(1, toObject(IntNode.valueOf(1), SchemaBuilder.unionOf().nullType().and().intType().endUnion())); + assertEquals(42.0, + toObject(DoubleNode.valueOf(42.0), SchemaBuilder.unionOf().intType().and().doubleType().endUnion())); + assertEquals("1", toObject(TextNode.valueOf("1"), SchemaBuilder.unionOf().intType().and().stringType().endUnion())); } }