JSON數(shù)據(jù)格式(一)
JSON
javaScript 對(duì)象表示法(Javascript Object Notation)。已經(jīng)成為現(xiàn)在互聯(lián)網(wǎng)中數(shù)據(jù)交換格式。
Android API
Android API中有JSON解析,可以將文件、輸入流中的數(shù)據(jù)轉(zhuǎn)化為JSON對(duì)象,然后從對(duì)象中獲取JSON保存的數(shù)據(jù)內(nèi)容。 Android 中org.json包下,提供JSONObject、JSONArray、JSONStringer、JSONTokener、JSONException。
Json優(yōu)勢(shì)
易讀易編寫,也易于機(jī)器解析和生成。
兩種數(shù)據(jù)結(jié)構(gòu)
“名稱/值”對(duì)的集合,可以被理解為對(duì)象(object),記錄(Record),結(jié)構(gòu)(struct),字典(Dictionary),哈希表(HashTable),有鍵列表(Keyed list),或者掛鏈數(shù)組(Assocation arra)值的有序列表(An ordered list of values)。大部分語(yǔ)言里理解為數(shù)組。JSON Object
以key/value對(duì)形式{“名稱”:值}存在的無(wú)序的jsonObject對(duì)象,鍵值對(duì)之間用“,”隔開。其中key值必須是string類型,value可以是JSONObjects、JSONArrays、Strings、Booleans、Integers、Longs、Doubles或者NULL等的任意組合。如:{“name”:”jack”}
JSON Array
有序的value的集合,數(shù)組是值(value)的有序集合,使用“[ ]”括起來(lái),值之間用“,”逗號(hào)分隔,value可以是JSONObjects、JSONArrays、Strings、Booleans、Integers、Longs、Doubles或者NULL等的任意組合,如:{“info”:[{“name”:”jack”},{“name”:”rose”}]},{value1,value2,value3}。這些結(jié)構(gòu)可以嵌套。
JSONObject與JSONArray常用的方法
JSONObject
JSONObject.put() //將值放入其中JSONObject.getXXX() //若不存在此值,則返回異常JSONObject.optXXX() //若不存在此值,則返回空字符串具體可以參照官方鏈接 http://www.android-doc.com/reference/org/json/JSONObject.htmlJSONArray
JSONArray.put()JSONArray.getXXX()JSONArray.optXXX()JSONObject對(duì)象的創(chuàng)建
//創(chuàng)建JSONObject PRivate String createJSONObject() { JSONObject object = new JSONObject(); try { object.put("name", "jack_obj"); object.put("age", 11); object.put("undergraduate", true); // object.put("salary", null); //這種輸入null值,輸出在屏幕中不顯示salary這個(gè)key鍵。 object.put("salary", JSONObject.NULL); //這個(gè)則會(huì)顯示salary這個(gè)key,還有null值 } catch (JSONException e) { e.printStackTrace(); } return object.toString(); }JSONArray對(duì)象的創(chuàng)建
//創(chuàng)建JSONArray private String createJSONArray() { JSONArray array = new JSONArray(); array.put("jack_arr"); array.put(22); //生成JSONObject對(duì)象放入JSONArray中 JSONObject inner_obj1 = new JSONObject(); try { inner_obj1.put("name", "Alice"); inner_obj1.put("age", 34); } catch (JSONException e) { e.printStackTrace(); } JSONObject inner_obj2 = new JSONObject(); try { inner_obj2.put("name", "white"); inner_obj2.put("age", 45); } catch (JSONException e) { e.printStackTrace(); } array.put(inner_obj2); array.put(inner_obj1); return array.toString(); }JSONObject解析
//解析JSONObject數(shù)據(jù) private String parseJSONObject(String json) { String result = " "; try { JSONObject jsonObject = new JSONObject(json); //optString方法會(huì)在對(duì)應(yīng)的key中的值不存在的時(shí)候返回一個(gè)空字符串或者返回你指定的默認(rèn)值, // 但是getString方法會(huì)出現(xiàn)空指針異常的錯(cuò)誤。 String name = jsonObject.optString("name"); // String name = jsonObject.getString("name"); String age = jsonObject.optString("age"); if (!TextUtils.isEmpty(name)) { result += "name:" + name; } if (!TextUtils.isEmpty(age)) { result += "age:" + age; } return result; } catch (Exception e) { e.printStackTrace(); } return result; }JSONArray解析
//parseJSONObject方法是會(huì)在接下來(lái)parseJSONArray()中調(diào)用 private String parseJSONObject(JSONObject jsonObject) { String result = " "; /** * optString方法會(huì)在對(duì)應(yīng)的key中的值不存在的時(shí)候返回一個(gè)空字符串或者返回你指定的默認(rèn)值, * 但是getString方法會(huì)出現(xiàn)空指針異常的錯(cuò)誤。 * */ String name = jsonObject.optString("name"); // String name = jsonObject.getString("name"); String age = jsonObject.optString("age"); if (!TextUtils.isEmpty(name)) { result += "name:" + name; } if (!TextUtils.isEmpty(age)) { result += "age:" + age; } return result; } //解析JSONArray數(shù)據(jù) private String parseJSONArray(String array) { String result = " "; try { JSONArray jsonArray = new JSONArray(array); result = jsonArray.getString(0); result +=jsonArray.getString(1); result +=jsonArray.getString(2); for (int i = 2; i < jsonArray.length(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); result += parseJSONObject(jsonObject) + "/n/n"; // result += jsonObject.optString("jack"); } } catch (JSONException e) { e.printStackTrace(); } return result.toString(); }