踩坑: Fastjson类成员命名
背景
近期入职了新公司, 公司项目中使用 Fastjson 来处理 Json 数据.
一次开发某个需求时, 需要在数据类中新增字段, 我添加好后进行测试, 发现点击某个入口就会发生崩溃!
分析
控制台堆栈报错: com.alibaba.fastjson.JSONException: can not cast to int, value : true
.
根据报错信息, 很快就发现了对应代码:
- 在点击入口进入新页面时, 需要传递我修改过的那个数据类, 将数据实例序列化为json.
- 进入新页面后, 再反序列化json.
- 由于json序列化后的数据错误, 导致解析器反序列化出错.
我的数据类是下面这样的:
1 | // 示例 |
随后断点调试确认了下, 果然序列化后的json有问题{"isEnable":true}
.
猜测是函数和字段命名相同导致的, 当时添加字段同名函数 isEnable 是为了防止方便作判断, 同时防止魔术数字的出现.
重命名函数之后测试, 结果正常.
结论
Fastjson序列化, 取的是isEnable函数的返回值, 并非isEnable字段的值.
可以对函数重命名进行规避.
也有可能是某个 Fastjson 的版本有问题, 或者后面版本进行了修复, 未进行确认.
Fastjson版本: com.alibaba:fastjson:1.1.72.android
反思
然而, 我以往都是这么写的代码, 也不觉得这么写有什么问题. 但为什么以前没出错呢?
想了下后, 发现我以前是使用 Gson 处理的 Json 数据.
同时写代码做了验证, 发现 Gson 序列化后的json是正常的{"isEnable":1}
.
恩……珍爱生命, 远离 Fastjson !
踩坑: Fastjson类成员命名