diff --git a/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderAdapter.java b/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderAdapter.java index 1ec4325a6..71d980d04 100644 --- a/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderAdapter.java +++ b/core/src/main/java/com/alibaba/fastjson2/reader/ObjectReaderAdapter.java @@ -578,7 +578,9 @@ public class ObjectReaderAdapter FieldReader fieldReader = fieldReaders[i]; Object fieldValue = map.get(fieldReader.fieldName); if (fieldValue == null) { - continue; + if ((features2 & JSONReader.Feature.IgnoreSetNullValue.mask) != 0 || !map.containsKey(fieldReader.fieldName)) { + continue; + } } if (fieldReader.field != null && Modifier.isFinal(fieldReader.field.getModifiers())) { @@ -592,7 +594,7 @@ public class ObjectReaderAdapter } } - if (fieldValue.getClass() == fieldReader.fieldType) { + if (fieldValue == null || fieldValue.getClass() == fieldReader.fieldType) { fieldReader.accept(object, fieldValue); } else { if ((fieldReader instanceof FieldReaderList) diff --git a/core/src/test/java/com/alibaba/fastjson2/issues_3700/Issue3789.java b/core/src/test/java/com/alibaba/fastjson2/issues_3700/Issue3789.java new file mode 100644 index 000000000..bff7c5c05 --- /dev/null +++ b/core/src/test/java/com/alibaba/fastjson2/issues_3700/Issue3789.java @@ -0,0 +1,35 @@ +package com.alibaba.fastjson2.issues_3700; + +import com.alibaba.fastjson2.JSONException; +import com.alibaba.fastjson2.JSONObject; +import com.alibaba.fastjson2.JSONReader; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class Issue3789 { + @Test + public void test() { + String name = "abc"; + + assertThrows(JSONException.class, + () -> JSONObject.of("name", null).to(Bean.class)); + + assertNull(JSONObject.of("name", null).to(Bean.class, JSONReader.Feature.IgnoreSetNullValue).name); + assertNull(JSONObject.of().to(Bean.class).name); + + assertEquals(name, + JSONObject.of("name", name).to(Bean.class).name); + } + + public static class Bean { + private String name; + + public void setName(String name) { + if (name == null) { + throw new IllegalArgumentException(); + } + this.name = name; + } + } +}