1. 程式人生 > >安卓中的JSON解析

安卓中的JSON解析

JSON指的是JavaScript物件表示法(JavaScript Object Notation),它是一種輕量級的文字資料交換格式,類似於XML,但是比XML更小、更快、更易解析。

JSON是基於JavaScript的一個子集,它使用JavaScript語法來描述資料物件,但是JSON仍然獨立於語言和平臺。JSON解析器和JSON庫支援許多不同的程式語言。這些特性都使得JSON成為理想的資料交換語言,使其易於人們閱讀和編寫,同時也易於機器解析和生成。

1、JSON用於描述資料結構,有以下兩種形式:

(1)“名稱/值”對的集合
“名稱/值”對的集合形式又稱為JSON Object,其名稱和值之間使用“:”隔開,一般的形式如下:
{name:value}
例如:
{"Width":"800","Height":"600"}
其中名稱是字串,值可以是字串、數值、物件、布林值、有序列表或者null值。這是一系列非排序的非排序的“名稱/值”對,不同的語言中,這種“名稱/值”可以理解為物件(object)、記錄(record)、結構(struct)、字典(dictionary)、雜湊表(hash table)、有鍵列表(keyed list)或者關聯陣列(associative array)等。

(2)值的有序列表
值的有序列表形式又稱為JSON Array。在大部分語言中,值的有序列表被理解為陣列(array),一個或者多個值用“,”分隔後,使用“[”和“]”括起來就形成了這樣的列表,如下所示:
[collection,collection]
例如:
{
"employees":[
{"Width","800","Height":"600"},
{"Width","700","Height":"800"},
{"Width","900","Height":"900"},
]
}


2、解析JSON資料
解析JSON資料時,首先需要明確待解析的是JSON Object還是JSON Array,然後再解析。舉例如下:
(1)解析JSON Object之一
下面是一個簡單的JSON Object,name為名稱,Lili是name的值,將name和Lili用“:”隔開,其文字如下。
{"name":"Lili"}
JSONObject.getString("String")方法可以得到JSON物件中的String名稱對應的值。下面是對上面JSON物件的解析方法:
//新建JSONObject,JsonString字串中為上面的JSON物件的文字
JSONObject demoJson=new JSONObject(jsonString);
//獲取name名稱對應的值
String s=demoJson.getString("name");

(2)解析JSON Object之二
下面是一個包含兩個“名稱/值”對的JSON物件,兩個“名稱/值”對分別是"name1":"android"和"name2","iphone",中間使用“,”隔開,其文字如下:
{"name1":"android","name2","iphone"}
上面JSON物件的解析方法如下:
//新建JSONObject物件,將jsonString字串轉換為JSONObject物件
//jsonString字串為上面的文字
JSONObject demoJson = new JSONObject(jsonString);
//獲取名稱為name1對應的值
 String name1=demoJson.getString("name1");
//獲取名稱為name2對應的值
String name2=demoJson.getString("name2");

(3)解析JSON Array
下面是一個簡單的JSONArray,number為陣列名稱,[1,2,3]為陣列的內容,其JSON文字表示如下:
{"number":[1,2,3]}
上面JSON Array解析方法如下:
//新建JSONObject物件,將jsonString字串轉換為JSONObject物件
//jsonString字串為上面的文字
JSONObject demoJson = new JSONObject(jsonString);
//獲取number對應的陣列
JSONArray numberList=demoJson.getJSONArray("number");
//分別獲取numberList中的每個值
for(int i=0;i<numberList.length();i++){
	//因為陣列中的型別為int,所以為getInt,其他getString、getLong具有類似的用法
	System.out.println(numberList.getInt(i));
}

(4)解析JSON Object和JSON Array混合物件
下面是一個JSON Object和JSON Array的混合文字,mobile為JSON Object名稱,其對應的值為JSON Array,JSON Array中包含的物件為JSON Object,其文字表示如下:
{"mobile":[{"name":"android"},{"name":"iphone"}]}
上面的文字解析方法如下:
//新建JSONObject物件,將jsonString字串轉換為JSONObject物件
//jsonString字串為上面的文字
JSONObject demoJson = new JSONObject(jsonString);
//首先獲取名為mobile的物件對應的值
//該值為JSONArray,這裡建立一個JSONArray物件
JSONArray numberList=demoJson.getJSONArray("mobile");
//依次取出JSONArray中的值
for(int i=0;i<numberList.length();i++){
	//從第i個取出JSONArray中的值為JSON Object“名稱/值”對
	//通過getString("name")獲取對應的值
	System.out.println(numberList.getJSONObject(i).getString("name"));
}
3、JSON打包
要想在客戶端通過JSON傳送物件,需要在JSON把資訊全部“打包”之後將JSONObject轉換為String。這樣JSON就會將“打包”的資訊按照特定標準的格式進行“壓縮”,之後在服務端進行解析,讀取通過JSON傳送過來的資訊。
Android提供的JSON解析類都在org.json下,主要有以下幾個。
(1)JSONObject:可以看作是一個JSON物件,這是系統中有關JSON定義的基本單元,即前面提到的“名稱/值”對。
(2)JSONStringer:JSON文字構建類,這個類可以幫助快速和方便的建立JSON文字。其最大的優點在於可以減少由於格式的錯誤導致的程式異常,引用這個類可以自動嚴格按照JSON語法規則建立JSON文字。每個JSONStringer實體只能對應建立一個JSON文字。
(3)JSONArray:它代表一組有序的數值。將其轉換為String輸出(toString)所表現的形式是用方括號的包裹,數值以“,”分隔,及前面提到的值的有序列表。
(4)JSONTokener:JSON解析類。
(5)JSONException:JSON中涉及的異常。


下面看一個用JSONObject、JSONArray來構建的JSON文字的例子,其需要構建的文字如下:
{
"Strings":{"Strings1":"MyStrings","Strings2","MyStrings"},
"Number":["987654321","123456789","456789123"],
"String":"good",
"Int":100,
"Boolean":false
}
構建上述文字的主要程式碼如下:
try {
	//建立JSONObject物件
	JSONObject mJSONObject=new JSONObject();
	//為Strings建立JSONObject物件
	JSONObject Strings=new JSONObject();
	//為Strings JSONObject物件新增第一個“名稱/值”對
	Strings.put("Strings1", "MyStrings");
	//為Strings JSONObject物件新增第二個“名稱/值”對
	Strings.put("Strings2", "MyStrings");
	//將Strings新增到mJSONObject中
	mJSONObject.put("Strings", Strings);
	//為Number建立JSONArray物件
	JSONArray Number=new JSONArray();
	//將有序列表新增到Number中
	Number.put("987654321").put("123456789").put("456789123");
	//將Number新增到mJsonObject中
	mJSONObject.put("Number", Number);
	//將Int“名稱/值”對新增到mJsonObject中
	mJSONObject.put("Int", 100);
	//將Boolean“名稱/值”對新增到mJsonObject中
	mJSONObject.put("Boolean", false);					
} catch (JSONException ex) {
	throw new RuntimeException(ex);
}