本文系统介绍,JSON解析的成长史,未经允许,禁止转载。

JSON是一种轻量级的数据格式,一般用于数据交互

Android交互数据主要有两种方式:Json和Xml,Xml格式的数据量要比Json格式略大,为了节省流量,减轻服务器压力,目前绝大多数公司都使用Json交互。

目录

[一、使用原生方式解析Json](## 一、使用原生方式解析Json)

[二 、Gson框架的使用](##二 、Gson框架的使用)

[三 、插件GsonFormat快速实现JavaBean](##三 、插件GsonFormat快速实现JavaBean)

一、使用原生方式解析Json

Json主要通过”{ }” 和 “[ ]” 包裹数据,”{ }”里面存放key-value键值对, “[ ]” 里存放数组。

标准的Json格式key必须用双引号。 下面都是Json:

 {"name" : "jack", "age" : 10}

{"names" : ["jack", "rose", "jim"]}

[{"name" : "jack", "age" : 10},{"name" : "rose", "age" : 11}]

要想从JSON中挖掘出具体数据,得对JSON进行解析。分别来看看三个不同的Json是如何解析的:

public void parseJson1(){
String json1="{\"name\" : \"jack\", \"age\" : 10}";
try {
//把要解析的json通过构造方法告诉JSONObject
JSONObject jsonObject=new JSONObject(json1);
// 获取name
String name=jsonObject.getString("name");
int age=jsonObject.getInt("age");
Log.i("ParserJsonActivity","name:"+name);
Log.i("ParserJsonActivity","age:"+age);
} catch (JSONException e) {
e.printStackTrace();
}
} public void parseJson2(){
String json2="{\"names\" : [\"jack\", \"rose\", \"jim\"]}";
try {
//把要解析的json通过构造方法告诉JSONObject
JSONObject jsonObject=new JSONObject(json2);
//names对应的 JsonArray
JSONArray jsonArray=jsonObject.getJSONArray("names");
//遍历JSONArray
for(int i=0;i<jsonArray.length();i++){
Log.i("ParserJsonActivity","name"+i+":"+jsonArray.getString(i));
}
} catch (JSONException e) {
e.printStackTrace();
}
} public void parseJson3(){
String json3="[{\"name\" : \"jack\", \"age\" : 10},{\"name\" : \"rose\", \"age\" : 11}]";
try {
//把要解析的json通过构造方法告诉JSONArray
JSONArray jsonArray=new JSONArray(json3);
//遍历JSONArray
for(int i=0;i<jsonArray.length();i++){
//根据i的位置获取JSONObject
JSONObject jsonObject = jsonArray.getJSONObject(i);
String name = jsonObject.getString("name");
int age=jsonObject.getInt("age");
Log.i("ParserJsonActivity","name"+i+":"+name);
Log.i("ParserJsonActivity","age"+i+":"+age);
}
} catch (JSONException e) {
e.printStackTrace();
}
}

上面的代码,主要使用了JSONObject和JSONArray。

用Android原生的Api有一句真理,别问我怎么知道的,很难:

当碰到 “{ }”时用JSONObject解析,遇到“[ ]”时用JSONArray解析。

分别运行下三个方法,看看结果:

想要的数据全部都获取到了。

二 、Gson框架的使用

如果你认为使用JSONObject和JSONArray来解析JSON数据已经非常简单了,那你就容易太满足了。早就有框架可以使用了。

常见的框架有 Gson,Jackson等等,他们都各有优缺点,但是总体区别不大。

GSON方式

* 原理:基于事件驱动

* 优点:解析方法简单、解析效率高、占存少、灵活性高

* 使用情境:适用于需要处理大型 JSON文档、JSON文档结构复杂的场合

Jackson方式

* 原理:基于事件驱动

* 优点:解析效率最高、在数据量大的情况优势尤为明显、占存少

* 缺点:必须完全解析文档,如果要按需解析的话可以拆分Json来读取,操作和解析方法复杂;

* 使用情境: 适用于需要处理超大型JSON文档、不需要对JSON文档进行按需解析、性能要求较高的场合

我一直用GSON方式解析,使用起来比较简单。

首先在app/build.gradle中添加依赖。

dependencies {
...
compile 'com.google.code.gson:gson:2.6.2'
}

Gson是基于事件驱动,根据所需要取的数据通过建立一个对应于JSON数据的JavaBean类就可以通过简单的操作解析出所需JSON数据。

步骤1:创建一个与JSON数据对应的JavaBean类(用作存储需要解析的数据)

GSON解析的关键是重点是要根据json数据里面的结构写出一个对应的javaBean,规则是:

* JSON的大括号对应一个对象,对象里面有key和value(值)。在JavaBean里面的类属性要和key同名;

* JSON的方括号对应一个数组,所以在JavaBeanBean里面对应的也是数组或者集合,数据里面可以有值或者对象;

* 如果数组里面只有值没有key,就说明它只是一个纯数组,如果里面有值有key,则说明是对象数组。纯数组对应JavaBean里面的数组类型,对象数组要在Bean里面建立一个内部类,类属性就是对应的对象里面的key,建立了之后要创建一个这个内部类的对象,名字对应数组名;

* 对象里面嵌套对象时候,也要建立一个内部类,和对象数组一样,这个内部类对象的名字就是父对象的key。

注意:JavaBean类里的属性不一定要全部和JSON数据里的所有key相同,可以按需取数据,也就是你想要哪种数据,就把对应的key属性写出来,注意名字一定要对应。

接下来,我们来看下下面两条JSON数据按照上面的规则应该何如生成JavaBean对象。

{"name" : "jack", "age" : 10}

{"names" : ["jack", "rose", "jim"]}

第一个:

/**
* {"name" : "jack", "age" : 10}
*/
public class Person1 {
private String name;
private int age; public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
}
}

第二个:

/**
* {"names" : ["jack", "rose", "jim"]}
*/
public class Person2 { private List<String> names; public List<String> getNames() {
return names;
} public void setNames(List<String> names) {
this.names = names;
}
}

再来看看使用如何Gson解析:

主要方法为:fromJson()

public  void  useGsonParser1(){
String json1="{\"name\" : \"jack\", \"age\" : 10}";
Gson gson=new Gson();
//把json数据解析成Person1对象
Person1 person1 = gson.fromJson(json1, Person1.class);
Log.i("UseGsonActivity","name:"+person1.getName());
Log.i("UseGsonActivity","age:"+person1.getAge());
}
public void useGsonParser2(){
String json2="{\"names\" : [\"jack\", \"rose\", \"jim\"]}";
Gson gson=new Gson();
Person2 person2=gson.fromJson(json2,Person2.class);
List<String> names = person2.getNames();
for(int i=0;i<names.size();i++){
Log.i("UseGsonActivity","name"+i+":"+names.get(i));
}
}

细心的同学会发现,之前使用JSONObject和JSONArray解析了3条数据,而我们并没有使用GSON解析最后一条。

[{"name" : "jack", "age" : 10},{"name" : "rose", "age" : 11}]

最后一条比较特殊,是以”[ ]”开头,我们知道因为大括号{ } 代表的是对象,中括号[]代表的是集合或者数组,所以javaBean直接使用Person1就行了,只不过返回的是一个集合或者数组。我们需要借助TypeToken,具体代码如下:

public  void useGsonParser3(){
String json3="[{\"name\" : \"jack\", \"age\" : 10},{\"name\" : \"rose\", \"age\" : 11}]";
Gson gson=new Gson();
List<Person1> person2=gson.fromJson(json3,new TypeToken<ArrayList<Person1>>(){}.getType());
for(int i=0;i<person2.size();i++){
//根据i的位置获取JSONObject
Person1 person1 = person2.get(i);
String name = person1.getName();
int age=person1.getAge();
Log.i("UseGsonActivity","name"+i+":"+name);
Log.i("UseGsonActivity","age"+i+":"+age);
}
}

调用上面的三段代码来看看运行结果:



想要的数据依然全部都获取到了。

上面的Gson介绍,基本上可以满足绝大多数的开发需求。

三 、插件GsonFormat快速实现JavaBean

上面我们介绍了,使用Gson开源库解析JSON数据,大家可能会发现虽然解析代码比较简单,但是还需要自己按照规则写一个javaBean。

好消息来了,通过AndroidStudio插件,你甚至不需要再手动写JavaBean了,让你Biubiubiu的立刻完成~

首先需要安装GsonFormat ,安装方式:

1. Android Studio File->Settings..->Plugins–>Browse repositores..搜索GsonFormat

2. 安装插件,重启Android Studio。



重启完了,接下来就是见证奇迹的时刻了。

我们以下面的JSON为例,让大家看看如何快速生成JavaBean:

{
"showapi_res_code": 0,
"showapi_res_error": "",
"showapi_res_body": {
"areaCode": "0871",
"city": "昆明",
"name": "中国电信",
"num": 1890871,
"postCode": "650000",
"prov": "云南",
"provCode": "530000",
"ret_code": 0,
"type": 2
}
}

使用方式,在实体类中使用Generate的快捷键。默认快捷键 alt+Insert。



选择GsonFormat

把JSON数据粘贴进去。然后联系点击OK,就会自动生成想要的JavaBean。



动态效果图:



使用GsonFormat可以极大的提高开发的效率,有木有一种如沐春风的感觉啊。

更多精彩请关注微信公众账号likeDev,公众账号名称:爱上Android。

JSON解析的成长史——原来还可以这么简单的更多相关文章

  1. Android之JSON解析

    做个Android网络编程的同学一定对于JSON解析一点都不陌生,因为现在我们通过手机向服务器请求资源,服务器给我们返回的数据资源一般都是以JSON格式返回,当然还有一些通过XML格式返回,相对JSO ...

  2. 一起写一个JSON解析器

    [本篇博文会介绍JSON解析的原理与实现,并一步一步写出来一个简单但实用的JSON解析器,项目地址:SimpleJSON.希望通过这篇博文,能让我们以后与JSON打交道时更加得心应手.由于个人水平有限 ...

  3. JAVA自已设计JSON解析器

    当然,有很多很好的JSON解析的JAR包,比如JSONOBJECT,GSON,甚至也有为我们测试人员而打造的JSONPATH,但我还是自已实现了一下(之前也实现过,现在属于重构). 思想是这样的,以这 ...

  4. android json解析及简单例子

    JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据 ...

  5. jsonObject jsonArray jsonTokener jsonStringer,json解析以及http请求获取josn数据并加以解析

    JSON的定义: 一 种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的 支持),从而可以在不同平台间进行 ...

  6. [Android]天气App 3 网络数据的请求和Json解析

      Android客户端开发,不仅仅是在Android端开发,还需要有相应的后台服务支持,否则的话,客户端的数据就只能放到本地自己做处理.我认为的原生态的App就是对应服务端的Client.他能像浏览 ...

  7. 项目开发笔记-传单下发 名片替换 文件复制上传/html静态内容替换/json解析/html解析

    //////////////////////////// 注意: 此博客是个人工作笔记 非独立demo////////////////////////////////// .............. ...

  8. android Json解析详解

    JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语 言的支持),从而可以在不同平台间进行数 ...

  9. QF——网络之JSON解析和XML解析

    JSON解析和XML解析: 用苹果原生的代理方式的网络请求后返回的都是二进制数据(NSData). 若是json,则通过NSJSONSerialization把NSData数据转换为JSON对象. N ...

随机推荐

  1. Git 对已经加入版本控制的文件,修改后希望不被提交办法

    参考网址:http://my.oschina.net/zlLeaf/blog/197740 问题举例:假设网站有一个数据库配置文件db.php,通过git做版本控制,已经将这个文件提交到git库中.但 ...

  2. Git同账号多平台配置

    最近工作中使用到了Git,虽然以前学习过,但是已经忘的差不多了,遂将本次配置过程整理成笔记以备忘 生成公钥 ssh-keygen -t rsa -C "gana10007@163.com&q ...

  3. 快速乘O(1)和O(log)

    O(1)快速乘来自骆可强:<论程序底层优化的一些方法与技巧> //O(1)快速乘 inline LL quick_mul(LL x,LL y,LL MOD){ x=x%MOD,y=y%MO ...

  4. 2019阿里云开年Hi购季新用户分会场全攻略!

    2019阿里云云上Hi购季活动已经于2月25日正式开启,从已开放的活动页面来看,活动分为三个阶段: 2月25日-3月04日的活动报名阶段.3月04日-3月16日的新购满返+5折抢购阶段.3月16日-3 ...

  5. web前端学习(四)JavaScript学习笔记部分(2)-- JavaScript语法详解

    2.1.Javascript语法-运算符(1) 复数运算符 %取余 ++ -- 赋值运算符 += -= *= /= %= 字符串操作 <!DOCTYPE html> <html la ...

  6. GitHub的注册与使用

    1. 注册账号: 地址: https://github.com/输入账号.邮箱.密码,然后点击注册按钮. 2. 初始设置 注册完成后,选择Free免费账号完成设置 3.验证账号 新建一个仓库 发现邮箱 ...

  7. KiCad 工程用 Git 管理需要忽略哪些文件?

    KiCAD 工程用 Git 管理需要忽略哪些文件? KiCAD 使用的 文本格式,天生可以用 Git 来管理. 但是并非所有文件需要使用 Git 管理,以下文件可以忽略. *.bak fp-info- ...

  8. 洛谷P1929 迷之阶梯

    P1929 迷之阶梯 题目描述 在经过地球防卫小队的数学家连续多日的工作后,外星人发的密码终于得以破解.它 告诉我们在地球某一处的古老遗迹中,存在有对抗这次灾难的秘密武器.防卫小队立即赶 到这处遗迹. ...

  9. Sublime text2 常用插件

    很早就安装了这款软件,因为听说很NB.但是一直都是习惯用vim, 所以一直没有去学习它, 现在用用感觉确实很不错,所以找了些插件, 参考网址: http://www.hphq.net/Marketin ...

  10. 【转】MySQL的btree索引和hash索引的区别

    Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-T ...