老手们要序列化,小伙子要gson解析json数组,到底哪个更好

       下面内容是本作者从官网中看对應的教程后所做的demo其体现了作者对相关知识点的个人理解。作者才疏学浅,难免会有理解不到位的地方。

还请各位读者批判性对待。

       本文主要介绍在gson解析json数组数据的序列化与反序列化的过程中我经经常使用到的三种工具的基本用法,及其它们之间

。希望能够对讀者们有一些帮助。

这里介绍到的三种解析与生成gson解析json数组数据的方法各自是:标准gson解析json数组解析与生成方法、使用gson解析与生成gson解析json數组数据

首先。这些工具都能够到对应的官网中下载

下面给出我所用到的jar包的下载链接:

一、对于gson解析json数组数据的描写叙述

       gson解析json数组是┅种轻量级的数据交换格式(个人觉得在非常多方面上,其优于XML)我个人将其数据形式总结例如以下:

{}表示一个对象,以  键:值  对的形式给絀对象的内部成员及成员变量的值

多个内部成员之间用 逗号。来隔开

集合和数组都用[]来表示。

}

本文对应的项目是 项目地址 

使鼡  去解析 gson解析json数组 应该是很常见的,大部分的情况下我们只要创建一个 Gson 对象然后根据 gson解析json数组 和对应的 Java 类去解析就可以了。

但是对于比較复杂的 gson解析json数组比如下面这种, attributes 对应的 gson解析json数组Object 中的字段是完全不一样的这个时候再简单的用上面的方法就解析不了了。


虽然这样能实现整个 gson解析json数组 的反序列化但是这种方式比较麻烦,而且一点也不优雅如果项目中存在很多这样的情况,就会做很多重复的体力勞动
如何更优雅、更通用的解决这类问题,在网上没有找到答案只好去深入研究一下Gson了。带着这样的目的翻看了,发现了一句话

这呴话说 Gson 可以处理任意的 Java 对象那么对于上面讲的那种反序列化情况来讲, Gson 应该也能做到通过研究 Gson 的文档,发现可以通过自定义gson解析json数组Deserializer嘚方式来实现解析这种 gson解析json数组Object 类型不同的情况

经过一番捣鼓,写了一个工具类对于上面的那个复杂 gson解析json数组,用了不到10行代码就搞萣而且比较优雅和通用。

本文就简单分析一下如何通过自定义 gson解析json数组Deserializer 来实现一个通用的工具类用于解析复杂类型 gson解析json数组对于以后碰到相似问题,这种处理方法可以提供一种解决问题的思路具体的代码和实例,可以查看如果对您的思路有一些启发,欢迎交流和Star

gson解析json数组Deserializer 是一个接口,使用的时候需要实现这个接口并在 GsonBuilder 中对具体的类型去注册当反序列化到对应的类的时候就会调用这个自定义 gson解析json數组Deserializer 的 deserialize() 方法。下面对这个方法的几个参数做一下解释以便于更好的理解Gson解析的过程。

2.gson解析json数组Array 这个类在 Gson 中代表一个数组类型一个数组僦是gson解析json数组Element的集合,这个集合中每一个类型都可能不同这是一个有序的集合,意味着元素的添加顺序是被维持着的上面例子中list对应嘚 “[]” 包裹起来的gson解析json数组就是gson解析json数组Array。

到了这里我们就应该想到type 对应的 value 肯定是要与具体的 JavaBean 对应起来的。比如在这里就是

我们注册的昰父类 Attribute 当反序列化需要解析 Attribute 的时候就会把对应的 gson解析json数组 作为参数回调自定义的 gson解析json数组Deserializer 。我们就可以在下面这个方法中写自己的逻辑嘚到我们需要的 Attribute 对象了

但是细心的朋友应该会发现了,这个时候传递的 gson解析json数组 有可能是这样的

我们想想具体解析成哪个,我们肯定昰需要知道 type 对应的 value 而这个 type 是与 attributes 同级的字段,照着刚才这样肯定是没希望拿到这个 value 的

前面那我们讲过,调用 gson解析json数组DeserializationContext 的方法应该注意死循环在具体的实践中,我虽然没有调用 gson解析json数组DeserializationContext 的方法但是依然出现了死循环的情况。就是因为我是这么用的

1.在项目中,可能还会存在另一种格式的gson解析json数组外部没有单独的type元素,而是与其它的元素放在同一个gson解析json数组Object中这样的格式更省事,不需要注册外层的typeAdaper即鈳

// 如果所要解析的 gson解析json数组Obejct 中已经含有能够表示自身类型的字段,不需要注册外层 Type这样更省事

在Android中我们反序列这样的 gson解析json数组 后一般會把得到的对象的设置到列表控件上,如果后端返回的 gson解析json数组 中包含之前未注册的类型为了程序不至于 crash,需要对反序列化的 null 对象进行過滤项目中提供了一个工具类 ListItemFilter 可以过滤集合中为 null 的元素。

对于如何优雅的解析这种类型不同的 gson解析json数组Object 刚开始我是缺少思路的,在网仩也没有查到合适的文档但是通过查看 Gson 的文档和源码,通过自己的理解和分析逐步的完成了这个过程。我的一个感触就是多去看看官方的使用文档应该比盲目去搜索解决方案更好。

代码是最好的文档本文只简单介绍了一些实现思路,文中贴出的一些代码是为了讲述方便与项目中的代码可能会有有些区别。具体的使用可以看中的例子

如果有问题,欢迎提 issue 或留言如果对您有所帮助,欢迎Star

}
  • 这里的 “muser” 也就是数组的名称,称它为数据头防止跟里面的 字段 有歧义;
  • 如果没有数据头,那就叫它纯数据或者纯数组数据;

根据约定,也就是这个 gson解析json数组 里面呮有一个数组(gson解析json数组Array)而且这个数组没有名字,比如像下面这样的:

这里其实是最简单的一种 gson解析json数组 数组格式强大的 GSON 可以直接解析成一个 List 。但在这里我先不直接解析就用比较老实的方法去解析,因为需要引出两个东西

首先我们需要建立一个Bean对象,注意变量名偠跟字段名称一致没什么好说的:

下面这是解析过程,先看代码:

从代码中可以看出解析的步骤如下:

  • 需要一个 gson解析json数组 解析类对象将gson解析json数组的字符串转成 gson解析json数组Array 前提是我们知道 gson解析json数组 中只有纯数组;

代码本身不难,容易看懂但前面说到,这里我故意这样写洇为需要说两个东西:

好了,就为了说这两个东西记住,后面将会用到

来看一下运行的图吧,很简单的东西后面的二三都是这样的效果,就不重复贴图了:

有人说这还不简单,在第一招中的 getAsgson解析json数组Array 加一个字符串就是咯就像这样:

"motto": "先定一个小目标,比如我先赚一個亿"
  • 第三招全部解析出来;
  • 第四招,要什么解析什么;

至于为什么反人类不好说。大家看代码就知道了代码很简单,跟 XML 的解析差不哆是根据节点来的,至于怎么用还是那句话直接看代码吧,确实处理起来逻辑清晰但是代码量上,真的不敢恭维

只贴代码不作解釋,如想详细了解看文末链接。

上面代码有省略因为好长…运行图如下:

以上几乎就是 JSO N数组的所有情况了,这五招也几乎能全部搞定!不得不说GSON 确实比较强大,强大在于可以将 gson解析json数组 直接解析成对象比以前的手动去解析方便太多,当然 fastgson解析json数组 也能实现这点但昰这东西还是官方的用的顺手。

在学习的过程中也是一步一步来的,所以文章也是学习的过程从简单的例子学到关键内容,再解决复雜情况由于文章写得仓促,如有疑问或错误欢迎交流与指正,谢谢!

}

我要回帖

更多关于 gson解析json数组 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信