关于Gson定制的分析
首先,为什么需要定制呢?很多同学可能觉得默认的不也挺好的嘛?最开始,我也是觉得的,而且我们一开始也是用默认的解析方式的,因为我们与外部约定的数据格式一直都比较稳定。但当外部数据不稳定,那么Gson默认配置的弊端就体现出来。很多同学可能觉得,你应该叫后台改啊,坦白说,我也觉得是这样的,毕竟我们都是按协议去开发数据模型的,你不按约定的协议去做,不是你的锅,难道是我的啊?!首先,一点是明确的,那就是如果后台没有按双方之前约定的格式输出数据,那一定是后台的问题,这点,我也不否认的。
但是,我始终觉得,我们所有的开发和努力都应该是为了更好地服务用户而做的。简而言之,我们是为产品的最终用户负责的。而作为最靠近用户一端的APP,责无旁贷地要肩负起这个潜在的责任。后台数据错了,我们可以认为外部环境有问题了,APP运行的外部环境出问题了,当然APP肯定很难独善其身,但我们更应该尽可能地减少对用户的影响,而之后的分锅大会毕竟是我们内部的事了……
好,那我们说说,为什么Gson的默认配置有那些对于我们来说是缺陷的问题,
1、一个字段有错,则整个字段出错。//但是我们希望这个字段出错,就不要解析这个字段了;
2、字段如果是null的话,则该字段就为null。//但是我们希望所有字段不要有null值存在,特别是基本数据类型;
3、如果该字段是一个对象,则定义为String就报错。//但是我们希望的是无论是什么字段,只要定义为String就永远是对的;
而这些要求Gson的默认配置都是不能满足的,要自己去定义。很多同学可能觉得,要求这么多,还不如自己做个Json解析器得了。真心话是:不到万不得已,不要自己去造轮子。因为人生苦短……,如果必须得造,也尽量参考成熟的轮子,毕竟已经使用这么多年,总归会有些经验值得借鉴的。
我们定制的时候更多也是参考内置解析器去做的,有的是直接改内置解析器去做的。这样即安全,也高效。
gson在做解析的时候内部全是基于JsonReader去操作的,所以理解这个类是进行解析的关键。如果大家去搜就会发现,其实没有什么博客去写这个类的使用。但是作为过来人,我知道大家肯定很想有个“从入门到精通”的博客来给大家介绍这个类。那这个教程在哪?就是这个类的源码!如果,你看不下去,哪后面可能就不太好理解了……
因为JsonReader对每一步操作都有个判断的枚举类:JsonToken。这个枚举类包含了每一个将要进行的操作的字段类型:
BEGIN_ARRAY, END_ARRAY, BEGIN_OBJECT, END_OBJECT, NAME, STRING, NUMBER, BOOLEAN, NULL, END_DOCUMENT
其含义直接看名字就知道。这也是我们进行自定义解析的前提。
1、如何知道哪个字段出错呢?就是通过判断JsonReader.peek()去获取即将要操作的字段信息是否与返回的类型相匹配,如果不能匹配,那就会报错。
所以,如果我们可以修改为,如果不匹配就直接忽略该字段;比如我们要解析的是List,但是我们通过peek后发现即将操作的并不是List,有可能是null或者空的Object,那我们便可以忽略该字段,而直接返回一个空的List。核心代码如下:

2、所以如果要知道每个字段出错了,那就得每个都判断一下,这比较繁琐,但是只有这种办法。但是由于最基本的结构通常都是:int、long、float、double、String五种,我们可以先自定义这五种,如果后面还有写比较奇怪的类型,我们可以再慢慢加加。
3、首先我们解析的就是String,为什么定义一个字段为String竟然不能成功。所以我们得单独为String做个比较特别的解析器。就是除了正常的String字段以外,即便它不是String,比如数组或者对象,我们依然能够进行String的解析。核心代码如下:

经过这样的定制以后,Gson的解析就可以符合我们的开篇的需求了。
关于Gson定制的分析的更多相关文章
- Gson源码分析之Json结构抽象和注解使用
github上的博客地址: http://chuyun923.github.io/blog/2015/01/06/gsonyuan-ma-fen-xi/ XML和Json作为最常用的两种网络传输格式而 ...
- [转]使用Java Mission Control进行内存分配分析
jdk7u40自带了一个非常好用的工具,就是Java Mission Control.JRockit Misson Control用户应该会对mission control的很多功能十分熟悉,JRoc ...
- 基于 Bootstrap 的响应式后台管理面板
你想建立一个后台管理面板或者分析仪表板吗?不需从头开始,Keen IO Bootstrap 是一个响应式的仪表盘模板,可以帮助你在几分钟内呈现数据,让你可以创建一个有吸引力的,定制的分析仪表板,随时可 ...
- 杂记- 3W互联网的圈子,大数据敏捷BI与微软BI的前端痛点
开篇介绍 上周末参加了一次永洪科技在中关村 3W 咖啡举行的一次线下沙龙活动 - 关于它们的产品大数据敏捷 BI 工具的介绍.由此活动,我想到了三个话题 - 3W 互联网的圈子,永洪科技的大数据敏捷 ...
- Nginx源码研究八:nginx监听socket实现流程
前面描述了nginx系统分析nginx的配置文件,初始化模块相关参数的过程,这里利用nginx监听socket的实现过程,做一次完整的回顾 1.首先,nginx启动的main函数中,会先初始化cycl ...
- P2P技术详解(一):NAT详解——详细原理、P2P简介
1. IPv4协议和NAT的由来 今天,无数快乐的互联网用户在尽情享受Internet带来的乐趣.他们浏览新闻,搜索资料,下载软件,广交新朋,分享信息,甚至于足不出户获取一切日用所需.企业利用互联网发 ...
- jenkin插件整理
分类 plugin名称 wiki地址 源码地址 plugin作用范围 备注 Build Reports构建报告(此类插件用来分析构建结果,比果代码检查,测试CASE分析,并将这些结果以报表,趋势图等形 ...
- NAT详解:基本原理、穿越技术(P2P打洞)、端口老化等
这是一篇介绍NAT技术要点的精华文章,来自华3通信官方资料库,文中对NAT技术原理的介绍很全面也很权威,对网络应用的应用层开发人员而言有很高的参考价值. 学习交流 移动端即时通讯学习交流: 21589 ...
- 一篇文章带你看懂AWS re:Invent 2018大会,揭秘Amazon Aurora
本文由云+社区发表 | 本文作者: 刘峰,腾讯云NewSQL数据库产品负责人.曾职于联想研究院,Teradata北京研发中心,从事数据库相关工作8年.2017年加入腾讯数据库产品中心,担任NewSQL ...
随机推荐
- Java对象转换成xml对象和Java对象转换成JSON对象
1.把Java对象转换成JSON对象 apache提供的json-lib小工具,它可以方便的使用Java语言来创建JSON字符串.也可以把JavaBean转换成JSON字符串. json-lib的核心 ...
- ViewPager+Fragment 懒加载
转载于: 作者:尹star链接:http://www.jianshu.com/p/c5d29a0c3f4c來源:简书 ViewPager+Fragment的模式再常见不过了,以国民应用微信为例,假 ...
- CentOS ifconfig无IP地址解决办法
修改/etc/sysconfig/network-scripts/ifcfg-ens33 把 ONBOOT 改为 yes,重启后就会有ip,且物理机和虚拟机可以互相ping通了.
- 什么是副作用(Side Effect)
副作用(Side Effect)是指函数或者表达式的行为依赖于外部世界.具体可参照Wiki上的定义,副作用是指 1)函数或者表达式修改了它的SCOPE之外的状态 2)函数或者表达式除了返回语句外还与外 ...
- 小白的Python之路 day4 迭代器
迭代器 学习前,我们回想一下可以直接作用于for循环的数据类型有以下几种: 1.集合数据类型,如list.tuple.dict.set.str等: 2.是generator,包括生成器和带yield的 ...
- open-falcon(v0.2)安装grafana部署
下载rpm wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-4.4.3-1.x86_64.rpm 本地 ...
- Python学习(三):迭代器、生成器、装饰器、递归、算法、正则
1.迭代器 迭代器是访问集合的一种方式,迭代对象从集合的第一个元素开始访问,直到元素被访问结束,迭代器只能往前不能后退,最大的优点是不要求事先准备好整个迭代过程中的元素,这个特点使得它特别适合用于遍历 ...
- lesson - 1 笔记 网络连接 /putty 密钥登陆
---笔记 一.网络连接配置 1. 查看电脑ip 地址: ifconfig -a 2. 自动获取ip 地址: dhclient 默认BOOTPROTO=dhcp 和真机同一网段 3. 手动配置 ...
- 5.前端基于react,后端基于.net core2.0的开发之路(5) 配置node层,session设置、获取,请求拦截
1.总结一下 今年,2月份从深圳来到广州,工作到现在,回头看,完成的项目4-5个,公司基本没有懂技术的领导,所以在技术选型上,我们非常的自由,所以内心一直都不满足现状,加上一起工作的小伙伴给力(哈哈哈 ...
- python 字符串中的%s与format
你可以选择字符串拼接,你也可以选择使用%s或者是format,下面简单介绍一下它们的使用方法: # 在字符串后面跟%,然后后面加上要被替换的值 print('I like %s' % 'apples' ...