[BUG]当对象的字段是复杂对象且值为空时,WriteNulls会导致NullPointerException
- Dominant language
- Java
- Stars
- 4.4k
- Forks
- 613
- Avg merge
- 1d 22h
- Merged PRs (30d)
- 6
Description
### 问题描述
* 当对象的字段是复杂对象且值为空时,WriteNulls会导致NullPointerException
### 环境信息
*请填写以下信息:*
- JDK信息: [e.g.:Openjdk 1.8.0_312]
- 版本信息:[e.g.:Fastjson2 2.0.59]
### 重现步骤
1. User对象下有Address对象字段
2. address字段值置为空
3. 调用JSONObject.from(user, JSONWriter.Feature.WriteNulls)
```java
import java.util.Date;
import java.util.LinkedHashMap;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.JSONWriter;
public class FastJson2Test {
public static void main(String[] args) {
User user = new User();
user.setId("U00001");
user.setRealName("Foo");
user.setCreateTime(new Date());
JSONObject json = JSONObject.from(user, JSONWriter.Feature.WriteNulls);
System.out.println(new LinkedHashMap<>(json));
}
@Data
protected static class User {
private String id;
private String realName;
private String remark;
private Address address;
private Date createTime;
}
@Data
protected static class Address {
private String id;
private String city;
}
}
```
### 相关日志输出
Exception in thread "main" java.lang.NullPointerException
at com.alibaba.fastjson2.writer.FieldWriterStringFunc.getFieldValue(FieldWriterStringFunc.java:36)
at com.alibaba.fastjson2.writer.ObjectWriterAdapter.toJSONObject(ObjectWriterAdapter.java:618)
at com.alibaba.fastjson2.writer.ObjectWriterAdapter.toJSONObject(ObjectWriterAdapter.java:610)
at com.alibaba.fastjson2.writer.ObjectWriterAdapter.toJSONObject(ObjectWriterAdapter.java:691)
at com.alibaba.fastjson2.JSON.toJSON(JSON.java:4027)
at com.alibaba.fastjson2.JSONObject.from(JSONObject.java:2259)
at FastJson2Test.main(FastJson2Test.java:14)
Contributor guide
Research direction
Reproduce the supplied User and Address example with JSONObject.from and JSONWriter.Feature.WriteNulls, then start at com.alibaba.fastjson2.writer.FieldWriterStringFunc.java:36 and the ObjectWriterAdapter.toJSONObject calls in the stack trace. Done means converting a User whose nested address is null completes without a NullPointerException and preserves the requested null-field behavior.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java
- Domain
- backend
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Clearly specified
- Newbie friendliness
- 50/100