踩坑: Fastjson类成员命名

背景

近期入职了新公司, 公司项目中使用 Fastjson 来处理 Json 数据.

一次开发某个需求时, 需要在数据类中新增字段, 我添加好后进行测试, 发现点击某个入口就会发生崩溃!

分析

控制台堆栈报错: com.alibaba.fastjson.JSONException: can not cast to int, value : true.

根据报错信息, 很快就发现了对应代码:

  1. 在点击入口进入新页面时, 需要传递我修改过的那个数据类, 将数据实例序列化为json.
  2. 进入新页面后, 再反序列化json.
  3. 由于json序列化后的数据错误, 导致解析器反序列化出错.

我的数据类是下面这样的:

1
2
3
4
5
6
7
8
9
// 示例
class Data {
@JSONField(name = "isEnable")
public int isEnable;

public boolean isEnable() {
return isEnable == 1;
}
}

随后断点调试确认了下, 果然序列化后的json有问题{"isEnable":true}.

猜测是函数和字段命名相同导致的, 当时添加字段同名函数 isEnable 是为了防止方便作判断, 同时防止魔术数字的出现.

重命名函数之后测试, 结果正常.

结论

Fastjson序列化, 取的是isEnable函数的返回值, 并非isEnable字段的值.
可以对函数重命名进行规避.

也有可能是某个 Fastjson 的版本有问题, 或者后面版本进行了修复, 未进行确认.

Fastjson版本: com.alibaba:fastjson:1.1.72.android

反思

然而, 我以往都是这么写的代码, 也不觉得这么写有什么问题. 但为什么以前没出错呢?

想了下后, 发现我以前是使用 Gson 处理的 Json 数据.

同时写代码做了验证, 发现 Gson 序列化后的json是正常的{"isEnable":1}.

恩……珍爱生命, 远离 Fastjson !

作者

王文辉

发布于

2024-11-15

更新于

2024-11-18

许可协议