Android-Gson小总

几乎每次项目中都要用到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();

好了常用的就这么多,剩下的比如:属性重命名,字段过滤啥的,不常用。以后用到再说吧,我去看世界杯了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏NetCore

对List.Sort的简单研究

最近一直忙着修改项目中的bug,特别是一些绑定的列表排序,因为是中途加入的,所以我一般不改变别人的存储过程或者类方法,只在需要的时候帮其排序一下,不过非常郁闷。...

211100
来自专栏ml

spring设置全局异常处理器

1.spring设置全局异常,它的原理是向上捕获 spring.xml配置 <!--自定义全局异常处理器--> <bean id="globalE...

424150
来自专栏小怪聊职场

爬虫课堂(二十七)|使用scrapy-redis框架实现分布式爬虫(2)源码分析

63860
来自专栏xingoo, 一个梦想做发明家的程序员

Apache Commons CLI命令行启动

今天又看了下Hangout的源码,一般来说一个开源项目有好几种启动方式——比如可以从命令行启动,也可以从web端启动。今天就看看如何设计命令行启动... ...

23670
来自专栏跟着阿笨一起玩NET

关于webservice不支持方法重载的解决办法

15310
来自专栏码农分享

LinqToExcel.Extend 源码分析

展开目录结构,我们能够更加请详细的分析出每个目录所完成的功能模块。 这里主要讲解工具集中最重要的一个模块Validate

16440
来自专栏Golang语言社区

go语言的sql包原理与用法分析

本文实例讲述了go语言的sql包原理与用法。分享给大家供大家参考,具体如下: go的sql包是在pkg/database中,里面的两个包sql和sql/driv...

46660
来自专栏大内老A

ASP.NET MVC是如何运行的(3): Controller的激活

ASP.NET MVC的URL路由系统通过注册的路由表对HTTP请求进行解析从而得到一个用于封装路由数据的RouteData对象,而这个过程是通过自定义的Url...

23380
来自专栏圣杰的专栏

ABP入门系列(8)——Json格式化

讲完了分页功能,这一节我们先不急着实现新的功能。来简要介绍下Abp中Json的用法。为什么要在这一节讲呢?当然是做铺垫啊,后面的系列文章会经常和Json这个东...

38490
来自专栏wannshan(javaer,RPC)

dubbo通信消息解析过程分析(1)

由于rpc底层涉及网络编程接口,线程模型,网络数据结构,服务协议,细到字节的处理。牵涉内容较多,今天就先从一个点说起。 说说,dubbo通过netty框架做传...

54360

扫码关注云+社区

领取腾讯云代金券