几乎每次项目中都要用到Gson来解析json数据,今天想做个总结。ok,现在我们先来了解一下JSONObject和JsonObject的区别(我个人总结了三点):上图。
可以一眼看到他们的不同:
(1)不同包。JSONObject是android自带的org.json包中,而JsonObject则是google.gson包下的需要添加build.gradle依赖:implementation'com.google.code.gson:gson:2.8.0'
除此之外,我们先看看他们怎么存json数据吧,先看Android自带的JSONObject:
创建:
打印打印结果:
总结,就是通过new JSONObject和JSONArray对象,让后put()进去即可。
我们看一看google推荐的gson是如何存储json数据的:
总结:JsonObject调用addProperty()添加value值,但如果添加的JsonArray则需要调用add()方法,这和android自带的JSONObject有点不同.也稍微麻烦点。
(2)第二个不同,我们都知道Android JSONObject是通过HashMap来存储key/value值,那么google的JsonObject是不是一样呢?上图:
这就是不同了:Anroid自带JSONObject是通过HashMap来存值而Google的JsonObject是通过LinkedTreeMap来存值,感兴趣的同学可以了解一下二者的区别.
(3)第三点不同,我们给之前的数据添加一个value为null的键值对。看两者的效果,上图:
打印结果:
总结:第三点不同就是: Android自带的JSONObject如果value为null,会删除该键
google的JsonObject如果value值为null,仍会保留该键
本人最近发现在高版本的gson中已经没有JsonObject了(比如2.8.5),但是有JsonReader可以继续解析,不知道是不是不推荐了,这里就不跟大家详聊了..
说完了区别,我们来说一说常见的Gson与各种类型的转化
一:生成json
这个我们之前代码已经体现出来了:
值得一提的是:addProperty 方法底层调用的还是 add(String property, JsonElement value) ,他是将基本数据类型转化为了 JsonElement 对象,JsonElement 是一个抽象类,而 JsonObject 是继承了 JsonElement 的,所以我们可以通过 JsonObject 自己来构建一个 JsonElement。
如图:
打印:
数据结构:
如果我们JsonObject对象包含的key都叫name的话,我们就只会有一个name = "王五"的。只会保留最后一个。
二:json和数组之间的转化。
总结:其实就是gson.fromJson()和toJson()的调用
三:Json数组和List之间的转化
打印:
总结:其实还是调用gson.fromJson()和toJson()方法,只不过后面的参数不同,是通过TypeToken,最后getTyep();
好了常用的就这么多,剩下的比如:属性重命名,字段过滤啥的,不常用。以后用到再说吧,我去看世界杯了。
网友评论