This is an automated email from the ASF dual-hosted git repository.
lzljs3620320 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/paimon.git
The following commit(s) were added to refs/heads/master by this push:
new af23563277 [core] Fix Iceberg metadata parsing error by excluding null
doc field from JSON serialization (#7099)
af23563277 is described below
commit af23563277f4b0cf196ddd22aec5074570bc37ba
Author: KangJi <[email protected]>
AuthorDate: Thu Jan 22 12:27:20 2026 +0900
[core] Fix Iceberg metadata parsing error by excluding null doc field from
JSON serialization (#7099)
---
.../paimon/iceberg/metadata/IcebergDataField.java | 2 ++
.../iceberg/metadata/IcebergDataFieldTest.java | 36 ++++++++++++++++++++++
2 files changed, 38 insertions(+)
diff --git
a/paimon-core/src/main/java/org/apache/paimon/iceberg/metadata/IcebergDataField.java
b/paimon-core/src/main/java/org/apache/paimon/iceberg/metadata/IcebergDataField.java
index 0facdd47e4..55d67e55ee 100644
---
a/paimon-core/src/main/java/org/apache/paimon/iceberg/metadata/IcebergDataField.java
+++
b/paimon-core/src/main/java/org/apache/paimon/iceberg/metadata/IcebergDataField.java
@@ -42,6 +42,7 @@ import
org.apache.paimon.shade.jackson2.com.fasterxml.jackson.annotation.JsonCre
import
org.apache.paimon.shade.jackson2.com.fasterxml.jackson.annotation.JsonGetter;
import
org.apache.paimon.shade.jackson2.com.fasterxml.jackson.annotation.JsonIgnore;
import
org.apache.paimon.shade.jackson2.com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import
org.apache.paimon.shade.jackson2.com.fasterxml.jackson.annotation.JsonInclude;
import
org.apache.paimon.shade.jackson2.com.fasterxml.jackson.annotation.JsonProperty;
import
org.apache.paimon.shade.jackson2.com.fasterxml.jackson.databind.annotation.JsonDeserialize;
@@ -78,6 +79,7 @@ public class IcebergDataField {
@JsonIgnore private DataType dataType;
@JsonProperty(FIELD_DOC)
+ @JsonInclude(JsonInclude.Include.NON_NULL)
private final String doc;
public IcebergDataField(DataField dataField) {
diff --git
a/paimon-core/src/test/java/org/apache/paimon/iceberg/metadata/IcebergDataFieldTest.java
b/paimon-core/src/test/java/org/apache/paimon/iceberg/metadata/IcebergDataFieldTest.java
index f4aff2a79b..c00e3a2f5e 100644
---
a/paimon-core/src/test/java/org/apache/paimon/iceberg/metadata/IcebergDataFieldTest.java
+++
b/paimon-core/src/test/java/org/apache/paimon/iceberg/metadata/IcebergDataFieldTest.java
@@ -35,6 +35,7 @@ import org.apache.paimon.types.RowType;
import org.apache.paimon.types.TimestampType;
import org.apache.paimon.types.VarBinaryType;
import org.apache.paimon.types.VarCharType;
+import org.apache.paimon.utils.JsonSerdeUtil;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
@@ -545,4 +546,39 @@ class IcebergDataFieldTest {
assertThat(icebergStruct.fields().get(0).type()).isEqualTo("int");
assertThat(icebergStruct.fields().get(1).type()).isEqualTo("string");
}
+
+ @Test
+ @DisplayName("Test doc field serialization with null value")
+ void testDocFieldSerializationWithNullValue() {
+ // Test doc field is null
+ DataField dataFieldWithoutDoc = new DataField(1, "test_field", new
IntType(false));
+ IcebergDataField originalField = new
IcebergDataField(dataFieldWithoutDoc);
+
+ String json = JsonSerdeUtil.toJson(originalField);
+ IcebergDataField deserializedField = JsonSerdeUtil.fromJson(json,
IcebergDataField.class);
+
+ assertThat(deserializedField.id()).isEqualTo(1);
+ assertThat(deserializedField.name()).isEqualTo("test_field");
+ assertThat(deserializedField.required()).isTrue();
+ assertThat(deserializedField.type()).isEqualTo("int");
+ assertThat(deserializedField.doc()).isNull();
+ }
+
+ @Test
+ @DisplayName("Test doc field serialization with non-null value")
+ void testDocFieldSerializationWithNonNullValue() {
+ // Test doc field is not null
+ DataField dataFieldWithDoc =
+ new DataField(1, "test_field", new IntType(false), "test
description");
+ IcebergDataField originalField = new
IcebergDataField(dataFieldWithDoc);
+
+ String json = JsonSerdeUtil.toJson(originalField);
+ IcebergDataField deserializedField = JsonSerdeUtil.fromJson(json,
IcebergDataField.class);
+
+ assertThat(deserializedField.id()).isEqualTo(1);
+ assertThat(deserializedField.name()).isEqualTo("test_field");
+ assertThat(deserializedField.required()).isTrue();
+ assertThat(deserializedField.type()).isEqualTo("int");
+ assertThat(deserializedField.doc()).isEqualTo("test description");
+ }
}