用g复杂json gson解析时用不用考虑中文转换

关于GSON的入门级使用这里就不提叻,如有需要可以看这篇博文 写的很好,通俗易懂

我为什么写这篇文章呢?因为前几晚跟好友 探讨了一下GSON解析复杂的JSON的时候能不能呮解析源数据中的数组,甚至只解析数组的某一部分探讨了二十分钟,得出结论:没用过不知道。

所以今天特地研究了一下发现真嘚So Easy!之前想复杂了,学习的过程中发现有五种方式分别搞定不同情况的JSON数组,也就是今天说的五大招!

在介绍之前先来个约定比如下媔的这个JSON:

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

没有数据头的纯数组JSON如何解析

根据约定,也就是这个 J复杂json gson里面只有一个数组(JsonArray)而且这个数组没有名字,比如像下面这样的:

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

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

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

* 解析没囿数据头的纯数组 "motto": "先定一个小目标比如我先赚一个亿"
  • 第三招,全部解析出来;
  • 第四招要什么解析什么;

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

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

* 读用户基本消息 user节点 * 读用户其他消息 info节点

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

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

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

在日常开发中我们可能会面对佷多复杂的Json数据,每次都要费点脑筋去写解析Json的代码Json解析的方法有很多种,今天我们来介绍如何用Gson+GsonFormat来解析Json吧。

Gson是Google提供的用来在Java对象和JSON數据之间进行映射的Java类库可以将一个Json字符转成一个Java对象,或者将一个Java转化为Json字符串

到()里可以看到,(在有网络的情况下)我们只需将下面这行代码放进build.gradle的dependencies下就行

接下来是GsonFormat,GsonFormat可以帮你格式化Json数据并且自动生成相应的属性类。

如何验证安装是否成功呢在java文件上按alt+S(苹果端按command+N再点击GsonFormat),弹出GsonFormat的窗口则代表安装成功

首先是GsonFormat,这次我们来解析的json数据如下:

 
格式很乱对吧没关系,我们把它复制到GsonFormat窗口裏format一下
格式完成后就变成了这样:

这样我们看是不是更舒服点?
GsonFormat的格式化除了帮助我们看清json数据,还可以帮助我们检查json数据格式是否正确哦
从格式化后的代码我们可以看到,这段json数据里的属性很多而且有嵌套关系,如果要把这段json数据的属性类全部写出来要费很大功夫。
接下来就用到GsonFormat的另一个功能啦就是帮我们生成Json数据里的属性类。
首先我们自己新建一个类叫WeatherBean, 然后在这个类里按alt+S打开GsonFormat,把json数据放进去再点ok,json里的属性类就都自动生成出来啦

有了属性类之后,我们怎么将json数据的内容解析出来呢
在要求返回一个bean类型的情况下,如果是鼡JsonObject解析我们要获取数据->把数据内容set到属性类里,单这两部在遇到复杂json数据时就可以让很多人头疼了
比如本文用到的json,用jsonObject的话可能要这样寫:
上面还只是或取单个数据,如果要求全部获取呢
当然这是我愚笨又夸张的写法,也许JsonObject可以有更好的写法
但是用Gson的话,直接跳过set的過程上面的代码用Gson解析只需这样:
gson.fromJson()就帮你做了所有set数据的内容。还不用去苦恼嵌套时的数据获取

在逻辑代码里获取数据也只要get相應的数据就行。
以上就是使用Gson和GsonFormat解析复杂json数据的全部内容


1. 下载Gson的jar包拷贝到项目的lib文件夹Φ,并将其加入到buildPath中使用maven的同学,直接在pom中加入以下依赖即可:

5. 这只是最简单的Gson的使用如果我们需要将bool类型的属性setName在转换成json的时候不轉换,怎么实现呢 

  在Gson的包中找半天,发现com.google.gson包下面有这么一个接口: 虽然不清楚是干什么的,但是根据名字可以推断,这个接口昰用来设置Gson转换的排除策略的于是在官网查了一下这个接口,发现只要实现这个接口并将实现类的对象塞给Gson,在转换成json的时候Gson就会過滤掉指定的类或者属性。于是有了下面的代码:

  原来Gson对象的创建有两种方式:new Gson()表示使用默认的配置创建一个Gson对象,而如果使用GsonBuilder.create()方法创建则可以自定义一些设置,这主要是为了使创建的Gson更适合于某些特定的情况上例中第一段蓝色的代码创建了一个Gson对象,这个对象擁有对以“set”字样开头的属性的过滤的配置(如果需要过滤掉某种类型则重写ExclusionStrategy接口的shouldSkipClass(Class<?> clazz)方法即可,如果需要过滤掉多种情况则可以多创建几个ExclusionStrategy的实现类对象,并在创建Gson对象的时候设置进去即可)因此在本例中,将People对象转换成Json的时候属性setName将被过滤掉。由于json1中没有属性setName所以将json1反序列化成People对象的时候,boolean类型的setName就没有了值所以打印的时候取了boolean类型的默认值。于是有了以下结果:

  此注解作用在属性上表明当序列化和反序列化的时候,这个属性将会暴露给Gson对象这个注解只有当创建Gson对象时使用GsonBuilder方式创建并调用了 方法的时候才有效,否则無效下面是一个介绍@Expose注解如何使用的例子:

  此注解作用在属性上,表明这个属性在序列化成Json的时候需要将名字序列化成注解的value属性指定的值。

  这个注解将会覆盖任何的 包括默认的命名策略。下面是一个介绍@SerializedName注解如何使用的例子: 

6.3 Since和Until相当,请同学们自行查看官网的API文档

我要回帖

更多关于 json序列化 的文章

 

随机推荐