JavaBean的boolean isXXX反序列化问题
JavaBean规范中规定boolean
的getter/setter
为isXXX/setXXX
,包装类Boolean
的getter/setter
为getXXX/setXXX
,其中XXX
为变量名(IDE生成代码默认就是这种格式)。
当编写代码出现不规范命名,将boolean
变量声明为isXXX
时,为了保证序列化与反序列化,需将isXXX/setXXX
改为isIsXXX/setIsXXX
,然而IDE并不会为我们做这些。
此时如果使用老版本fastjson进行反序列化时就有可能出现问题,因为fastjson默认使用setter
方法为对象的变量赋值。 解决方案简单粗暴,更新版本fastjson-android>=1.1.49或者使用JSONField注解指定name。 然而使用Gson就没有问题,因为Gson默认使用反射field来为变量赋值。 因此使用Gson时要在混淆配置中保留fields
,使用fastjson时则要保留set*
方法。
我遇到的问题还略坑,使用老版本fastjson且不使用注解在未开启混淆的情况下boolean isXXX属性是能够正确解析的,开启混淆后就不行了。此时直接加注解是可以的,更新到新版本后不加注解也可以,想想也是心累,fastjson的文档和更新日志都没找到相关的说明。所以,在无法避免这种不规范命名时,请一定要 使用注解 指定一下。
写了个简单的Test Case放到了github,ParseTest
测试在开启混淆并配置混淆规则的情况下,fastjson的不同版本解析json的结果。以及使用Gson解析的情况。分别位于不同分支。
关于此问题fastjson的issue中还有一个大家争论的问题:是要求我们严格遵守规范还是fastjson提供兼容?
答案你已经知道了。 链接 https://github.com/alibaba/fastjson/issues/278