1.前言
上一篇文章向大家介绍了XML数据的解析,那么接下来我们要去学习如何解析JSON格式的数据,相对于XML,JSON的主要优势在于它的体积更小,在网络上传输的时候可以更省流量。但缺点在于,它的语义性较差,看起来不如XML直观。
2.数据分析
(1)JSON格式
JSON(JavaScript Object Notation)与XML格式相比较是一种轻量级的数据交换格式,JSON采用兼容性很高,完全独立于语言文本格式,可以在不同的平台之间进行数据交换。JSON数据格式比较简单,易于读写,格式都是压缩的,在传输的过程中占用带宽小并且它还支持多种语言,便于服务端和客户端的解析同时因为JSON格式能够直接为服务器端代码使用,大大简化了服务端和客户端的代码并且易于维护。
JSON数据分为两种结构:
name-value 键值对构成的集合,类似于Java中的Map
value的有序列表,类似于Java中的Array
3.实现方法
解析JSON数据也有很多种方法,可以使用官方提供的JSONObject,也可以使用谷歌的开源库GSON。除此之外还有一些第三方开源库如Jackson,FastJSON等可以用来解析JSON,
要进行解析的json文件如下
{
"rt": {
"tid": "20140318155513001",
"warehouseid": "47a7377d4a9e42e3a665af0894946e21",
"rc": "0000",
"rm": "成功",
"tasks": {
"task": [
{
"name": "102",
"refercode": "150303101458414",
"status": "3"
},
{
"name": "119",
"refercode": "20150303-6",
"status": "3"
},
{
"name": "202",
"refercode": "150307125515568",
"status": "3"
},
{
"name": "107",
"refercode": "150303140159283",
"status": "3"
}
]
}
}
}
(1)使用JSONObject
(1.1)首先,上面的JSON格式的字符串整个都在一对大括号当中,那么我们把这一对大括号里面的全部内容看做是一个JSONObject对象,这时我们需要通过JSONObject json = new JSONObject(strResult)来获取这个JSONObject对象,其中strResult就是那个大括号里的全部内容的字符串
(1.2)在大括号中你肯定会注意到最外层里面有“tid”,“warehouseid”,“rc”,“rm”等数据,如果要读取“tid”中的数据可以使用String tid = json.getString(tid)来获取,至于warehouseid,rc,rm中的值的获取方法以此类推
(1.3)在往下看我们会发现task的值是一个数组,这是因为JSON中中括号就是数组的标志,如果要读取这个数组可以使用JSONArray array = json.getJSONArray("task"),这是你会发现在task数组中有若干个大括号分别包含着不通的内容,那么每个大括号所包含的内容就是这个数组的一个元素,其中数组中的每个元素都是JSONObject的对象,通过JSONObject task = array.getJSONObject(i)来获取
(1.4)此时,你又会发现在task数组中的每一个元素中都有“name”,“refercode”,“status”等数据,那么就可以使用String task = json.getString(name)来获取
(1.5)现在对于最基本的JSON已经介绍完毕了,其实不管是对JSON数组的读取还是对普通对象的读取本质上没有大的区别,在进行JSONObject解析的过程中只需要记住一对大括号就是一个JSONObject对象,一对中括号就是一个JSONArray数组。一对大括号即一个JSONObject对象中可包含多个普通键值对、JSONObject对象和JSONArray数组,一对中括号即一个JSONArray数组中也可以包含多个普通键值对、JSONObject对象和JSONArray数组
需要定义一个Goods类
package com.example.administrator.jsonparser;
/**
* Created by ChuPeng on 2016/10/10.
*/
public class Goods
{
private String name;
private String refercode;
private String status;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getRefercode()
{
return refercode;
}
public void setRefercode(String refercode)
{
this.refercode = refercode;
}
public String getStatus()
{
return status;
}
public void setStatus(String status)
{
this.status = status;
}
}
解析数据的主要代码如下
package com.example.administrator.jsonparser;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
/**
* Created by ChuPeng on 2016/10/10.
*/
public class ParserJSONWithJSONObject
{
public static List<Goods> getJsonContentForJSONObject(String json)
{
List<Goods> goodsList = new ArrayList<Goods>();
try
{
JSONObject jsonObject = new JSONObject(json);
String rt = jsonObject.getString("rt");
JSONObject jsonObjectRt = new JSONObject(rt);
String tasks = jsonObjectRt.getString("tasks");
JSONObject jsonObjectTasks = new JSONObject(tasks);
String task = jsonObjectTasks.getString("task");
JSONArray jsonArray = new JSONArray(task);
for(int i = 0; i < jsonArray.length(); i++)
{
Goods goods = new Goods();
JSONObject jsonObjectTask = jsonArray.getJSONObject(i);
goods.setName(jsonObjectTask.getString("name"));
goods.setRefercode(jsonObjectTask.getString("refercode"));
goods.setStatus(jsonObjectTask.getString("status"));
goodsList.add(goods);
}
}
catch (Exception e)
{
e.printStackTrace();
}
return goodsList;
}
}
(2)使用GSON
如果你觉得上面使用JSONObject来解析JSON数据已经非常简单,那么接下来给大家介绍使用GSON来解析JSON数据的的方法,这种方法会简单到让你想象不到的地步。首先我们要使用这个功能就必须在项目中添加一个GSON的Jar包,下载地址为:http://code.google.com/p/google-gson/downloads/list
在我们下载好之后需要进行解压,我们会看到如下的几个文件
其中gson-2.2.4.jar这个文件就是我们需要的,我们需要把这个文件复制到所要使用项目的libs目录下,如下图所示
对于GSON的使用主要有两种:一种是将对象或者不同的内容转化为JSON格式(使用toJson()方法),另一种是将JSON格式的内容还原到相应的对象属性或者其它属性(使用fromJson()方法)
(2.1)将内容转化为JSON格式的数据(使用toJson()方法)
首先,使用Gson gson = new Gson()去创建gson对象
其次,要把内容转化为JSON格式时,需要新建一个JavaBean类并且进行初始化
最后,使用String str = gson.toJson(p)//p为JavaBean类的对象 进行解析
(2.2)将JSON格式的数据转化为内容(使用fromJson()方法)
fromJson()方法的神奇之处就在于可以将一段JSON格式的字符串自动映射成一个对象,从而不需要我们再手动去编写代码进行解析
如果一段JSON格式的数据如下所示
{"rc": "0000","rm": "成功"}
此时我们需要定义个Result类,并且加入rc和rm字段,然后进行简单的调用如下代码就可以利用GSON将JSON数据解析成为一个Result
Result的类定义为
public class Result
{
private String rm;
private String rc;
public String getRm()
{
return rm;
}
public void setRm(String rm)
{
this.rm = rm;
}
public String getRc()
{
return rc;
}
public void setRc(String rc)
{
this.rc = rc;
}
}
Gson gson = new Gson();
String json = "{"rc": "0000","rm": "成功"}";
Result result = gson.fromJson(json, Result.class);
以上是解析JSON字符串的方法,当我们要解析的是JSON字符串数组时,一般有两种方式:使用数组和使用List。因为使用List对于增删改查都比较方便,所以在实际应用的过程中还是使用List的情况比较多。
如果一段JSON字符串数组的数据如下所示
["Android","IOS","Windows Phone","Symbian","Black Berry"]
使用数组的方式:
Gson gson = new Gson();
String json = "["Android","IOS","Windows Phone","Symbian","Black Berry"]";
String[] strings = gson.fromJson(json,String[].class);
使用List的方式:
对于以上的代码直接将String[].class改为List<String>.class是行不通的,在这里使用Java泛型的时候要注意泛型擦除的问题。为了解决这个问题,Gson为我们提供了TypeToken来实现对泛型的支持,所以当我们希望使用将以上的数据解析为List<String>时需要这样写
Gson gson = new Gson();
String json = "["Android","IOS","Windows Phone","Symbian","Black Berry"]";
List<String> stringList = gson.fromJson(json, new TypeToken<List<String>>(){}.getType());
注意:TypeToken的构造方法是protected修饰的,所以上面才会写成new TypeToken<List<String>>() {}.getType() 而不是 new TypeToken<List<String>>().getType()
需要定义一个Goods类
package com.example.administrator.jsonparser;
/**
* Created by ChuPeng on 2016/10/10.
*/
public class Goods
{
private String name;
private String refercode;
private String status;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getRefercode()
{
return refercode;
}
public void setRefercode(String refercode)
{
this.refercode = refercode;
}
public String getStatus()
{
return status;
}
public void setStatus(String status)
{
this.status = status;
}
}
使用GSON解析上面json文件的主要代码
JSONObject jsonObject = new JSONObject(json);
String rt = jsonObject.getString("rt");
JSONObject jsonObjectRt = new JSONObject(rt);
String tasks = jsonObjectRt.getString("tasks");
JSONObject jsonObjectTasks = new JSONObject(tasks);
String task = jsonObjectTasks.getString("task");
gson = new Gson();
goodsList = gson.fromJson(task, new TypeToken<List<Goods>>(){}.getType());
4.总结
通过以上两种方法的讲解相信你现在一定可以灵活的解析JSON格式的数据了,总之,还是那句话—适合自己的才是最好的,大家要按自己的需求选择解析的方法。
以上Demo的源代码地址:点击打开链接