首先,为什么需要定制呢?很多同学可能觉得默认的不也挺好的嘛?最开始,我也是觉得的,而且我们一开始也是用默认的解析方式的,因为我们与外部约定的数据格式一直都比较稳定。但当外部数据不稳定,那么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定制的分析的更多相关文章

  1. Gson源码分析之Json结构抽象和注解使用

    github上的博客地址: http://chuyun923.github.io/blog/2015/01/06/gsonyuan-ma-fen-xi/ XML和Json作为最常用的两种网络传输格式而 ...

  2. [转]使用Java Mission Control进行内存分配分析

    jdk7u40自带了一个非常好用的工具,就是Java Mission Control.JRockit Misson Control用户应该会对mission control的很多功能十分熟悉,JRoc ...

  3. 基于 Bootstrap 的响应式后台管理面板

    你想建立一个后台管理面板或者分析仪表板吗?不需从头开始,Keen IO Bootstrap 是一个响应式的仪表盘模板,可以帮助你在几分钟内呈现数据,让你可以创建一个有吸引力的,定制的分析仪表板,随时可 ...

  4. 杂记- 3W互联网的圈子,大数据敏捷BI与微软BI的前端痛点

    开篇介绍 上周末参加了一次永洪科技在中关村 3W 咖啡举行的一次线下沙龙活动 - 关于它们的产品大数据敏捷 BI 工具的介绍.由此活动,我想到了三个话题 - 3W 互联网的圈子,永洪科技的大数据敏捷 ...

  5. Nginx源码研究八:nginx监听socket实现流程

    前面描述了nginx系统分析nginx的配置文件,初始化模块相关参数的过程,这里利用nginx监听socket的实现过程,做一次完整的回顾 1.首先,nginx启动的main函数中,会先初始化cycl ...

  6. P2P技术详解(一):NAT详解——详细原理、P2P简介

    1. IPv4协议和NAT的由来 今天,无数快乐的互联网用户在尽情享受Internet带来的乐趣.他们浏览新闻,搜索资料,下载软件,广交新朋,分享信息,甚至于足不出户获取一切日用所需.企业利用互联网发 ...

  7. jenkin插件整理

    分类 plugin名称 wiki地址 源码地址 plugin作用范围 备注 Build Reports构建报告(此类插件用来分析构建结果,比果代码检查,测试CASE分析,并将这些结果以报表,趋势图等形 ...

  8. NAT详解:基本原理、穿越技术(P2P打洞)、端口老化等

    这是一篇介绍NAT技术要点的精华文章,来自华3通信官方资料库,文中对NAT技术原理的介绍很全面也很权威,对网络应用的应用层开发人员而言有很高的参考价值. 学习交流 移动端即时通讯学习交流: 21589 ...

  9. 一篇文章带你看懂AWS re:Invent 2018大会,揭秘Amazon Aurora

    本文由云+社区发表 | 本文作者: 刘峰,腾讯云NewSQL数据库产品负责人.曾职于联想研究院,Teradata北京研发中心,从事数据库相关工作8年.2017年加入腾讯数据库产品中心,担任NewSQL ...

随机推荐

  1. effective java笔记之单例模式与序列化

    单例模式:"一个类有且仅有一个实例,并且自行实例化向整个系统提供." 单例模式实现方式有多种,例如懒汉模式(等用到时候再实例化),饿汉模式(类加载时就实例化)等,这里用饿汉模式方法 ...

  2. Solr4.10与tomcat整合并安装中文分词器

    1.solr Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器.Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置.可扩展,并对索引. ...

  3. iOS 讯飞语音测试没问题,一上线就用不了了

    看一下打包的版本是不是release, Debug : 调试版本,主要是让程序员使用,在调试的过程中调用 Debug 会启动更多的服务来监控错误,运行速度相对较慢,而且比较耗能. Release : ...

  4. iOSXML & JSON 简介

    XML & JSON 简介 •JSON –作为一种轻量级的数据交换格式,正在逐步取代XML,成为网络数据的通用格式 –基于JavaScript的一个子集 –易读性略差,编码手写难度大,数据量小 ...

  5. 页面重绘(repaint)和回流(reflow)

    前言 页面显示到浏览器上的过程: 1.1.生成一个DOM树. 浏览器将获取到的HTML代码解析成1个DOM树,包含了所有标签,包括display:none和动态添加的节点. 1.2.生成样式结构体. ...

  6. SpringMVC 返回json的两种方式

    前后台数据交互使用json是一种很重要的方式.本文主要探讨SpringMVC框架使用json传输的技术. 请注意,本文所提到的项目使用Spring 版本是4.1.7,其他版本在具体使用上可能有不一样的 ...

  7. 西门子flexable创建画面

    一.wincc flexable 创建画面包括以下四点 二.具体操作 1.组态画面模板 1)使用该模板的画面包括该模板的所有组件,一个模板也是一个画面 2)给模板上添加一个文本域如下图,则画面1也会显 ...

  8. lesson - 1 aming

    一.  Linux是什么* 关于Linux历史(http://www.aminglinux.com/bbs/thread-6568-1-1.html  需要大家查查资了解,也可以看看5期的视频)* 发 ...

  9. 基于telegraf+influxdb+grafana进行postgresql数据库监控

    前言 随着公司postgresql数据库被广泛应用,尤其是最近多个项目在做性能测试的时候都是基于postgresql的数据库,为了确定性能瓶颈是否会出现在数据库中,数据库监控也被我推上了日程.在网上找 ...

  10. [编织消息框架][JAVA核心技术]动态代理应用11-水平扩展实现

    由于示例,远程服务地址配置在properties文件,通过QMConfig类加载,最优方式是上节介绍过,放在共享内存上,只需要维护一份数据即可,如放在redis上 /** 服务地址<servic ...