记一次由不当使用fastjson序列化导致的bug

这样一行简单的调用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进行处理的。

相关redmin case

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_23204557

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值