1.简介
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。
JSON数据作为目前网络中主流的数据传输格式之一,应用十分广泛。
2. Json数据格式(两种)
Json数据有两种格式:
(1)对象 :对象表示为“{}”扩起来的内容,数据结构为 {key:value,key:value,…}的键值对的结构。 如:{id:10086,name:张三}
(2)数组:数组表示为“[ ]” 括起来的内容,数据结构为 [ value, value,value,…] 的单值形式。 如:[张三,李四、王五]
在网络获取的数据中,一般表现为两种格式嵌套的形式。
3.Json数据的常用类和接口
JSONObject ---------> json对象
JSONArray ----------> json对组对象
4. Json 的解析方式
(1)采用java 原生的Json解析
(2) Google 提供的Gson解析方式
(3) Alibaba 提供的FastJson解析方式
5.下面分别使用Json的三种解析方式来解析下面的json字符串
{
"data":[
{
"id":"5613",
"title":"茶百科androidV1.2新功能简介",
"name":"茶百科androidV1.2新功能简介",
"link":"http://sns.maimaicha.com/news/detail/5613",
"content":"1、 更新页面布局,增加首次登陆提示页。 2、 增加栏目导航,按照分类列表展示。"
},
{
"id":"5697",
"title":"雅安茶”旺季被腰斩 茶企建“爱心茶园”解困",
"name":"雅安茶”旺季被腰斩 茶企建“爱心茶园”解困",
"link":"http://sns.maimaicha.com/news/detail/5697",
"content":"雅安,一个在地震中被全国关注的城市。它是茶马古道的起源地,是世界上人工种茶最早的地方,有着深厚的茶文化底蕴。"
}
],
"errorMessage":"success"
}
5.1 首先对上面的Json数据进行格式分析
(1)最外层:一个大括号包裹的 Json 对象,根据{key,value }格式,key=data ; value=括号中包裹的数组;
(2)第二层:一个中括号包裹的Json数组里面有两个对象(绿色部分)表示的值,根据 [ value,value,value..]格式,value=大括号包裹的 id,title,name,link和content;
(3)第三层:可以把里面的value值,封装成一个对象来处理。
5.2 建立一个类来对( id,title,name,link和content)等进行封装
public class Tea {
private String id;
private String title;
private String link;
private String content;
public Tea() {
super();
}
public Tea(String id, String title, String link, String content) {
super();
this.id = id;
this.title = title;
this.link = link;
this.content = content;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getLink() {
return link;
}
public void setLink(String link) {
this.link = link;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String toString() {
return "Tea [id=" + id + ", title=" + title + ", link=" + link
+ ", content=" + content + "]";
}
}
5.3 原生Json 解析
public static List<Tea> getJsonData(String json){
List<Tea> list=new ArrayList<>();
//整个json字符串为一个 JSONObject 对象
JSONObject jsonObject=new JSONObject(json);
// 返回data 对应的value值:这里表示[]里面的内容
JSONArray jsonArray=jsonObject.getJSONArray("data");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject object=jsonArray.getJSONObject(i);
String id=object.getString("id");
String title=object.getString("title");
String name=object.getString("name");
String link=object.getString("link");
String content=object.getString("content");
Tea tea=new Tea(id,title,name,link,content);
list.add(tea);
}
return list;
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
5.4 Gson解析
首先要添加关于Gson 的第三方包 ,eclipse可以到网上下载jar包,然后添加依赖。使用 Android studio开发的可以直接在 File/ Project Structure/Dependencies中选择com.google.code.gson:gson:2.7 然后添加依赖即可。添加成功如下所示:
Gson 解析的 java 代码
public static List<Tea> parseJSON(String json) {
List<Tea> list = new ArrayList<>();
try {
JSONObject jsonObject = new JSONObject(json);
JSONArray array = jsonObject.getJSONArray("data"); //java提供的原生的类
//Gson解析
Gson gson = new Gson();
TypeToken<List<Tea>> type = new TypeToken<List<Tea>>() {
};
list = gson.fromJson(array.toString(), type.getType());
} catch (JSONException e) {
e.printStackTrace();
}
return list;
}
5.5 FastJson解析
FastJson也要引入第三方的工具包,eclipse可以下载然后添加依赖;Android Studio可以直接在File/ Project Structure/Dependencies 中找到 com.alibaba:fastjson:1.2.14 添加依赖即可,添加成功如下图:
FastJson 解析代码
public static List<Tea> parseJSONData(String json){
List<Tea> list = new ArrayList<>();
try {
JSONObject jsonObject = new JSONObject(json);
JSONArray array = jsonObject.getJSONArray("data");//java原生的类
//FastJson 解析
list=JSON.parseArray(array.toString(), Tea.class);
} catch (JSONException e) {
e.printStackTrace();
}
return list;
}
6. 总结
(1)原生的Json解析,需要根据json数据的结构,一步步的把数据获取出来,然后根据数据进行封装。
(2)Google 的 Gson 解析和 Alibaba 的FastJson解析,都可以把需要封装的部分直接从json数据中提取出来,不需要把具体数据提取出来再进行封装。相比起来Gson解析和FastJson解析,比原生的Json解析更加便捷。建议使用后两种。