Android 網路獲取資料之Json解析
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解析更加便捷。建議使用後兩種。