JSON

原来还可以这么简单

字号+ 作者:H5之家 来源:H5之家 2017-11-23 16:26 我要评论( )

本文系统介绍,JSON解析的成长史,未经允许,禁止转载。 JSON是一种轻量级的数据格式,一般用于数据交互 Android交互数据主要有两种方式:Json和Xml,Xml格式的数据量要比Json格式略大,为了节省流量,减轻服务器压力,目前绝大多数公司都使用Json交互。 目

本文系统介绍,JSON解析的成长史,未经允许,禁止转载。
JSON是一种轻量级的数据格式,一般用于数据交互

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

目录



一、使用原生方式解析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方式

Jackson方式

我一直用GSON方式解析,使用起来比较简单。
首先在app/build.gradle中添加依赖。

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

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

步骤1:创建一个与JSON数据对应的JavaBean类(用作存储需要解析的数据)
GSON解析的关键是重点是要根据json数据里面的结构写出一个对应的javaBean,规则是:

注意: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); } }

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

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
网友点评