这样一行简单的调用fastjson进行序列化的代码:JSON.toJSONString(policy)
导致了空指针异常,因为Policy类有这样一个方法:
public boolean isOfficialPolicy() {
return this.getParentId() > 0;
}
而某些情况下parentId为null。
简单查阅了一些资料,推测根本原因是fastjson的JSON.toJSONString方法会使用反射,而像上面这种is开头的方法都会被反射处理。找到了原因,也就有了三种处理思路:
一、使用注解@JSONField,令其不参与序列化:
@JSONField(serialize = false)
public boolean isOfficialPolicy() {
...
亲测有效
二、使用SerializerFeature.IgnoreNonFieldGetter,如:
// 设置 SerializerFeature.IgnoreNonFieldGetter 以减少序列化非必要的字段
final String holdersData = JSON
.toJSONString(packageScenarioHolderDTOs, SerializerFeature.IgnoreNonFieldGetter);
从字面意思来看,非field不会进行序列化。未亲测,估计有效。
三、不使用fastjson,改用Gson。估计有效,因为Gson的序列化方法好像是对field而非method进行处理的。