前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >源码追踪 - Gson解析部分属性值为null

源码追踪 - Gson解析部分属性值为null

作者头像
逝兮诚
发布2019-11-12 22:37:00
1.5K0
发布2019-11-12 22:37:00
举报
文章被收录于专栏:代码人生代码人生

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://cloud.tencent.com/developer/article/1537727

接口返回的json数据,有些key的值是null,而断点调试返回对象是有数据的。

原因是项目采用的gson做json解析,gson解析对象为json字符串时,对于对象中匿名内部类属性,会设Null值。

解决方法是不使用匿名内部类对象。

前端接收数据,实际对象是有值的。

代码语言:javascript
复制
{
  'code':0,
  'data': {
    'filter':[
    	null,
    	null
    ]
  }
}

filter对象我采用双括号初始化方式创建。

代码语言:javascript
复制
new List() {
  {
    add(new Filter() {
      {
        setName("");
        setCode("dd")
      }
    });
    add(new Filter() {
      {
        setName("");
        setCode("dd")
      }
    });
  }
  
}

gson赋值null的代码

com.google.gson.internal.bind.Excluder133行。

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。

gson如何解析

打印代码执行stack,可以看到gson一层一层解析json逻辑是解析属性,如果属性没有对应解析器,就新建解析对象继续解析,不停递归。递归的类顺序就在下面的堆栈中。

代码语言:javascript
复制
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)
gson源码如何改进

有兴趣可以给google提交一个PR,让它支持这个问题。就是需要修改com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper的判断。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-11-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • gson如何解析
  • gson源码如何改进
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档