版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://cloud.tencent.com/developer/article/1537727
接口返回的json数据,有些key的值是null,而断点调试返回对象是有数据的。
原因是项目采用的gson做json解析,gson解析对象为json字符串时,对于对象中匿名内部类属性,会设Null值。
解决方法是不使用匿名内部类对象。
前端接收数据,实际对象是有值的。
{
'code':0,
'data': {
'filter':[
null,
null
]
}
}
filter
对象我采用双括号初始化方式创建。
new List() {
{
add(new Filter() {
{
setName("");
setCode("dd")
}
});
add(new Filter() {
{
setName("");
setCode("dd")
}
});
}
}
gson赋值null的代码
com.google.gson.internal.bind.Excluder
133行。
gson为什么会setNull
?原因是它在之前进行对象和属性class是否一样的判断,如果要属性class和实际的对象的类型不一致,它就认为这个数据有问题,它就直接setNull
。而匿名内部类对象getClass
返回的对象是个随机命名类,与定义的class不一样,gson于是会判空。
代码在com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper
,55行
54行获得对象的runtimeType,这里是一个内部类对象。
55行判断是否与属性类是否一致。
56行会去拿到对应的TypeAdatper
的实现类,调用它的write()
方法。它拿到的就是com.google.gson.internal.bind.Excluder
下的TypeAdatper
,它会setNull。
打印代码执行stack,可以看到gson一层一层解析json逻辑是解析属性,如果属性没有对应解析器,就新建解析对象继续解析,不停递归。递归的类顺序就在下面的堆栈中。
at com.google.gson.TypeAdapter.toJsonTree(TypeAdapter.java:234)
com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:125)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:243)
at com.google.gson.TypeAdapter.toJsonTree(TypeAdapter.java:234)
有兴趣可以给google提交一个PR,让它支持这个问题。就是需要修改com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper
的判断。