JSON (官网) 是一种文本形式的数据交换格式,它比XML更轻量、比二进制容易阅读和编写,调式也更加方便。其重要性不言而喻。解析和生成的方式很多,Java中最常用的类库有:JSON-Java、Gson、Jackson、FastJson等。
项目中使用了Gson,然而现在发现Gson差点被自己玩坏,所以决定好好学习一下~
Gson 基本用法
Gson 提供了两个方法 fromJson()
和 toJson()
方法直接用于解析和生成Json。前者实现反序列化,后者实现序列化。
基本数据类型解析
|
|
基本数据类型生成
|
|
POJO类的生成与解析
|
|
生成Json:
解析Json:
属性重命名
之前我们认为Gson对于服务器json数据的解析,属性名称需要与json中的key保持一致,一一对应。但是我们经常会遇到一些不和谐的情况。。。
@SerializedName注解使用
我们期望的json数据
服务端返回的json数据
谷歌的大神,怎么可能不考虑这个问题,我们来看一下如何处理,我们只需要将POJO中属性变成
哦了,重命名的问题搞定~如果接口重用,后端的开发人员也更换了,来了一个偷懒的人。。。出现了下面的数据
|
|
|
|
我们如何处理?
为POJO字段提供属性备选名
SerializedName注解提供了两个属性,上面用到了其中一个,另外还有一个属性alternate(2.4版本以上),接收一个String数组。
当上面的三个属性(email_address、email、emailAddress)出现任意一个时都可以得到正确的结果。
Gson泛型使用
Gson 为我们提供了 TypeToken
来实现对泛型的支持。
基本类型数据解析
|
|
POJO的泛型数据解析
泛型的引入可以减少很多无关的代码,我们现在后台的数据接口数据主要有下面两类:
|
|
我们真正需要的是 data 所包含的数据,message 中的数据我们只需要统一处理一次。如果我们不定义泛型那么我们就需要这样定义POJO。
定义成泛型,就会简洁很多
然后我们只需编写data字段所对应的POJO即可,专注于我们的业务逻辑。
解析数据的写法:
或
Gson 流操作
Gson 的流操作是通过stream包下的JsonReader类和JsonWriter来实现的。
Gson 流反序列化
|
|
fromJson()方法实际上就是通过JsonReader来进行数据解析的,不信? 去看源码喽~
Gson 流序列化
序列化和反序列化始终是成对出现的,咱们这也不能让它落单不是。。。
类似的,toJson() 方法自然是通过JsonWriter实现序列化