关于kotlin gson序列化时出现null的一些注意点
现在前后端基本都用json来传输数据,kotlin因为有空校验比如这个类:
1 |
|
在kotlin中定义的都是非空,可是如果给的json是这样:
1 | { |
在Gson().fromJson(json,XXXDataBean::class.java)
拿到的对象中,data会为空。如果json不给data的话,那么data依然是初始化时的那个DataBean()
5.1 更新
发现一个新的问题
数据类:
1 | data class User( |
在AndroidStudio中点击Tools-Kotlin-Show Kotlin Bytecode
会出现字节码,再点击Decompile
能看到反编译的java文件
上面那个User
的构造中,可以看到age
没有默认值,name
给了个默认值,此时,java中的构造为
1 | public User(int age, String name) { |
如果User
中的参数都给一个默认值,如
1 | data class User( |
则对应java的构造会变成3个,多了个无参构造。
1 | public User(int age, @NotNull String name) { |
那么问题来了:
在构造都有默认值的情况下,Gson是能够正常解析的。但如果有非默认值的时候,也就是java文件中没有空参构造时,
1 | val json ="" |
结果为:gson: User(age=0, name=null)
,即使我们给了name
一个初始值,即使我们标明了name
是@NotNull
,解析的结果依然是个null。
结论:Gson解析需要一个空参构造,而kotlin如果构造中每个参数都有默认值的时候,会有一个空参,并且会正确的将默认值赋值。所以Gson可以正常解析。如果kotlin的构造有参数没有默认值,就会出问题。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 七夜的小屋!