一、JSON定義
? ? ? JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式。 易于人閱讀和編寫。同時也易于機(jī)器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一個子集。 JSON采用完全獨立于語言的文本格式,但是也使用了類似于C語言家族的習(xí)慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 這些特性使JSON成為理想的數(shù)據(jù)交換語言。
二、JSON格式
JSON建構(gòu)于兩種結(jié)構(gòu):
? ? ? ?“名稱/值”對的集合(A collection of name/value pairs)。不同的語言中,它被理解為對象(object),紀(jì)錄(record),結(jié)構(gòu)(struct),字典(dictionary),哈希表(hash table),有鍵列表(keyed list),或者關(guān)聯(lián)數(shù)組 (associative array)。
值的有序列表(An ordered list of values)。在大部分語言中,它被理解為數(shù)組(array)。
JSON具有以下這些形式:
? ? ? ?對象是一個無序的“‘名稱/值’對”集合。一個對象以“{”(左括號)開始,“}”(右括號)結(jié)束。每個“名稱”后跟一個“:”(冒號);“‘名稱/值’ 對”之間使用“,”(逗號)分隔。

數(shù)組是值(value)的有序集合。一個數(shù)組以“[”(左中括號)開始,“]”(右中括號)結(jié)束。值之間使用“,”(逗號)分隔。

值(value)可以是雙引號括起來的字符串(string)、數(shù)值(number)、true、false、?null、對象(object)或者數(shù)組(array)。這些結(jié)構(gòu)可以嵌套。

以上內(nèi)容摘自:《Json官網(wǎng)》
三、JSON解析常用類
1. Android JSON所有相關(guān)類,都在org.json包下
JSONObject、JSONArray、JSONException、JSONStringer、JSONTokener
2. 常見方法
使用get方法與使用opt方法的區(qū)別?
JsonObject 方法,opt* 與 get* 建議使用opt方法,因為get方法如果其內(nèi)容為空會直接拋出異常。不過JsonArray.opt*(index)會有越界問題需要特別注意。
opt、optBoolean、optDouble、optInt、optLong、optString、optJSONArray、optJSONObjectget、getBoolean、getDouble、getInt、getLong、getString、getJSONArray、getJSONObject
3. Android創(chuàng)建JSON
private String createJson()throwsJSONException
?{ ? ?JSONObject jsonObject =new JSONObject();
? ? ? jsonObject.put ("intKey",123);
? ? ? jsonObject.put ("doubleKey",10.1);
? ? ? jsonObject.put ("longKey",666666666);
? ? ? jsonObject.put ("stringKey","lalala");
? ? ? jsonObject.put ("booleanKey",true);
? ? ? JSONArray jsonArray =newJSONArray();
? ? ? jsonArray.put (0,111);
? ? ? jsonArray.put("second");
? ? ? jsonObject.put ("arrayKey", jsonArray);
? ? ? ?JSONObject innerJsonObject =newJSONObject();
? ? ? ?innerJsonObject.put ("innerStr","inner");
? ? ? ?jsonObject.put ("innerObjectKey", innerJsonObject);
? ? ? ?Log.e("Json", jsonObject.toString());returnjsonObject.toString();}
輸出結(jié)果:
{"intKey":123, "doubleKey":10.1, "longKey":666666666, "stringKey":"lalala", "booleanKey":true, "arrayKey":[111,"second"], "innerObjectKey":{"innerStr":"inner"}}
4. 解析上面創(chuàng)建的JSON
private void pareJson(String jsonStr) throws JSONException
?{ ? ?
? ? ? JSONObject jsonObject =newJSONObject(jsonStr);
? ? ? intintValue? = jsonObject.optInt("intKey");
? ? ? doubledoubleValue = jsonObject.optDouble("doubleKey");
? ? ? longlongValue= jsonObject.optLong("longKey");
? ? ? String strValue? ? = jsonObject.optString("stringKey");
? ? ? boolean boolValue? = jsonObject.optBoolean("booleanKey");
? ? ? JSONArrayarray= jsonObject.optJSONArray("arrayKey");
? ? ?intarrIntValue=array.optInt(0);
? ? ?String arrStrValue =array.optString(1);
? ? ? JSONObject innerJson = jsonObject.optJSONObject("innerObjectKey");
? ? ? String innerStr = innerJson.optString("innerStr");
? ? ? Log.e("Json","intValue = "+ intValue +" , doubleValue = "+ doubleValue+" , ? ? ? ?longValue = "+ longValue +" , strValue = "+ strValue+" , booleanValue = "+ boolValue +" , arrIntValue = "+ arrIntValue+" , arrStrValue = "+ arrStrValue +" , innerStr = "+ innerStr);? ? }
輸出結(jié)果:
intValue = 123 , doubleValue = 10.1 , longValue = 666666666 , strValue = lalala , booleanValue = true , arrIntValue = 111 , arrStrValue = second , innerStr = inner
更多具體信息詳見:
《Android學(xué)習(xí)筆記44:JSON數(shù)據(jù)解析》
四、Android JSON解析庫
? ? ? ?上面介紹都是使用Android提供的原生類解析JSON,最大的好處是項目不需要引入第三方庫,但是如果比較注重開發(fā)效率而且不在意應(yīng)用大小增加幾百K的話,有以下JSON可供選擇:
1.Jackson
3.Json-lib
《兩款JSON類庫Jackson與JSON-lib的性能對比(新增第三款測試)》
五、格式化工具
? ? ? 在日常開發(fā)中,如果涉及到與服務(wù)器端調(diào)試協(xié)議時,過程中難免遇到服務(wù)器端發(fā)送格式或者Android客戶端解析格式出現(xiàn)問題,這時需要把獲取到的JSON打印出來進(jìn)行問題定位,如果JSON比較短一眼就能看出來,但是如果很長的話想查找某一個字段或者JSON數(shù)組中某一位的值顯得特別困難,想要擺脫這種苦惱也很簡單,把JSON字符串格式化之后會發(fā)現(xiàn)苦惱瞬間無影無蹤。以下是以我常用的Notepad++進(jìn)行舉例,其他的編輯器也肯定有相應(yīng)的JSON插件,自己可以網(wǎng)上查找一下。
Notpad++ Json Viewer插件
安裝:
Notpad++ -> 插件(Plugins) -> Plugin Manager -> Show Plugin Manager -> Avaliable -> 選擇Json View -> 安裝(install)
使用:
選中Json字符串,
插件(Plugins) -> Format Json(快捷鍵Ctrl+Alt+Shift+M)
插件(Plugins) -> Show Json Viewer? 顯示Json視圖
兩篇非常好的關(guān)于josn解析的文章:?
1、Android系列---JSON數(shù)據(jù)解析 - xiaoluo501395377 - 博客園(很全面的解析)
2、[Android學(xué)習(xí)]JSON的三種解析方式 - Android移動開發(fā)技術(shù)文章_手機(jī)開發(fā) - 紅黑聯(lián)盟(三種解析方法)