什麼是JSON:
- JSON 指的是 JavaScript 對象表示法(JavaScript Object Notation)
- JSON 是輕量級的文本資料交換格式
- JSON 獨立于語言 (單純的資料格式,不受語言的限制)
-
JSON 具有自我描述性,更易了解
以上為官方對于Json的解釋,其實JSON就是一種JavaScript對象資料表示格式,不受程式語言的限制,以至于成為了目前前背景資料互動的通用資料格式,并逐漸地取代了XML。
本篇部落客要講解解析JSON資料的方法,包括:
- 原生解析方法:使用了JSON官方的一個Jar包,Android SDK裡面已經自帶了,是以不需要單獨下載下傳。
- GSON架構解析:google 提供的快速json的第三方架構。
JSON原生解析
JSONObject對象解析
首先看一下我們即将解析的資料:
{
"data":{
"title":"How to get JOSN data",
"author":"Zergen",
"content":"Please follow me"
}
}
基本原則:
- { }表示JSONObject對象
- [ ]表示JSONArray對象
資料分析:
那麼我們如何去解析呢?首先這段資料中,有一個data字段,裡面包含了3個關于data的屬性資訊。
我們首先分析一下,整個資料被{ }包住的,是以整個資料是一個JSONObject對象。
解析步驟:
- 執行個體化一個JSONObject對象,把獲得資料作為參數帶進去。
- 使用obj.getXXX方法取得對應的值,例如:getInt,getString,getJSONObject等
public void Jsonpra(){
String Jsondata ="{\"data\":{\"title\":\"How to get JOSN data\",\"author\":\"Zergen\",\"content\":\"Please follow me\"}}";
try {
JSONObject obj = new JSONObject(Jsondata); //執行個體化JSONObject對象,并參入參數:JSON對象資料
JSONObject data = obj.getJSONObject("data"); //data對應的值是一個JSONObject對象
String title = data.getString("title");
String author = data.getString("author");
String content = data.getString("content");
Log.e("TAG", "标題是:" + title + " " + "作者是:" + author + " " + "内容是:" + content);
} catch (JSONException e) {
e.printStackTrace();
}
}
運作結果如下:
JSONArray對象解析
還是先看一下我們即将解析的資料:
{
"data":[
{
"title":"How to get JOSN data",
"author":"Zergen",
"content":"Please follow me"
},
{
"title":"What is JSON?",
"author":"Mark",
"content":"JSON just is a kind of data format "
}
]
}
資料分析:
因為data對應的值用[ ]包住的,是以這個時候data字段對應的值不再是個JSONObject對象了,而是一個JSONArray數組對象了。其實解法與解析JSONObject對象是一個道理,隻不過多了一步周遊數組的步驟。
public void JsonArraypra(){
String jsondata = "{\"data\":[{ \"title\":\"How to get JOSN data\",\"author\":\"Zergen\",\"content\":\"Please follow me\"},{\"title\":\"What is JSON?\",\"author\":\"Mark\",\"content\":\"JSON just is a kind of data format \"}]}";
try {
JSONObject obj = new JSONObject(jsondata);
JSONArray data= obj.getJSONArray("data"); //擷取data對應的JsonArray對象
for (int i = 0;i<data.length();i++){ //周遊數組
JSONObject TempObj = data.getJSONObject(i); //參數為索引值
String title = TempObj.getString("title");
Log.e("TAG", "第"+(i+1)+"個标題是:"+title);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
運作結果如下:
E/TAG: 第1個标題是:How to get JOSN data
E/TAG: 第2個标題是:What is JSON?
如上我們講解了如何使用原生的代碼來解析JSON資料,但是往往在開發中,這樣的效率未免太低了,是以我們常常會用到第三方快捷解析JSON的架構,本篇部落格将會介紹GSON架構的簡單使用。
GSON架構解析
Gson解析是google 提供的快速Json的第三方架構 。Gson與原生相比最大的優點就在于可以按照bean類對資料進行解析。
要想使用Gson需要自己手動導入jar包,此處不再贅述導入方法了。
Gson解析JSONObject對象
我們還是使用和之前一樣的資料,以便于對比兩種不同的解析方法:
{
"data":{
"title":"How to get JOSN data",
"author":"Zergen",
"content":"Please follow me"
}
}
解析步驟:
- 定義一個實體類,類名随意,但是請注意:類中成員變量名要和json資料中字段完全一緻。
-
執行個體化Gson對象。調用對象中fromjson方法,根據不同的情況填寫參數,詳情看下面的解析代碼:
首先定義個實體類,名字為Essay
public class Essay {
private String title;
private String author;
private String content;
}
這裡隻是寫出了類裡面定義的對應json資料裡面的成員,還需要寫出類的構造函數和對應的set、get方法。
public void gsonpra(){
String Jsondata ="{\"data\":{\"title\":\"How to get JOSN data\",\"author\":\"Zergen\",\"content\":\"Please follow me\"}}";
try {
JSONObject obj = new JSONObject(Jsondata);
String GsonData = obj.getString("data"); //把data對應的JSONObject對象當做字元串拿出來
Gson gson = new Gson();
Essay e = gson.fromJson(GsonData, Essay.class); //參數一:需要解析的資料(String) 參數二:class<T> 決定函數傳回的類型
Log.e("TAG", "GSON解析:"+"标題是:" + e.getTitle() + " " + "作者是:" + e.getAuthor() + " " + "内容是:" + e.getContent());
} catch (JSONException e) {
e.printStackTrace();
}
}
運作結果如下:
關鍵方法為fromJson,該方法第一個參數為需要解析的json資料,第二個參數為需要解析成的目标對象的class。
Gson解析JSONArray對象
我們還是使用和之前一樣的資料:
{
"data":[
{
"title":"How to get JOSN data",
"author":"Zergen",
"content":"Please follow me"
},
{
"title":"What is JSON?",
"author":"Mark",
"content":"JSON just is a kind of data format "
}
]
}
和解析JSONObject對象一樣的,首先定義個實體類,名字為Essay
public class Essay {
private String title;
private String author;
private String content;
}
需要注意的是,解析JSONArray數組對象所使用的fromjson方法的第二個參數需要是type類型的參數,此參數擷取比較麻煩,直接上代碼吧:
public void gsonarray(){
String jsondata = "{\"data\":[{ \"title\":\"How to get JOSN data\",\"author\":\"Zergen\",\"content\":\"Please follow me\"},{\"title\":\"What is JSON?\",\"author\":\"Mark\",\"content\":\"JSON just is a kind of data format \"}]}";
try {
JSONObject obj = new JSONObject(jsondata);
String GsonData = obj.getString("data");
Gson gson = new Gson();
Type type = new TypeToken<ArrayList<Essay>>(){}.getType(); //通過TypeToken中間類來擷取Essay的Type
ArrayList<Essay> essays = gson.fromJson(GsonData, type); //type決定函數傳回值的type
for (int i =0;i<essays.size();i++){
Essay e = essays.get(i);
Log.e("TAG", "GSON解析數組:" + "第" + (i + 1) + "個标題是:" + e.getTitle());
}
} catch (JSONException e) {
e.printStackTrace();
}
}
運作結果如下:
E/TAG: GSON解析數組:第1個标題是:How to get JOSN data
E/TAG: GSON解析數組:第2個标題是:What is JSON?
如上我們講解了如何使用Gson架構來解析JSON資料
總結
其實除了Gson還有許多第三方解析JSON資料的架構,比如阿裡巴巴的fastJson,以後如果有機會的話,我也會把此架構的使用方法更新在這裡