Android JOSN 解析

一、JSON定義

? ? ? JSON(JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式脐瑰。 易于人閱讀和編寫。同時(shí)也易于機(jī)器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一個(gè)子集丸相。 JSON采用完全獨(dú)立于語(yǔ)言的文本格式,但是也使用了類似于C語(yǔ)言家族的習(xí)慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)彼棍。 這些特性使JSON成為理想的數(shù)據(jù)交換語(yǔ)言灭忠。

二、JSON格式

JSON建構(gòu)于兩種結(jié)構(gòu):

? ? ? ?“名稱/值”對(duì)的集合(A collection of name/value pairs)座硕。不同的語(yǔ)言中弛作,它被理解為對(duì)象(object),紀(jì)錄(record)华匾,結(jié)構(gòu)(struct)映琳,字典(dictionary),哈希表(hash table)蜘拉,有鍵列表(keyed list)刊头,或者關(guān)聯(lián)數(shù)組 (associative array)。

值的有序列表(An ordered list of values)诸尽。在大部分語(yǔ)言中原杂,它被理解為數(shù)組(array)。

JSON具有以下這些形式:

? ? ? ?對(duì)象是一個(gè)無(wú)序的“‘名稱/值’對(duì)”集合您机。一個(gè)對(duì)象以“{”(左括號(hào))開始穿肄,“}”(右括號(hào))結(jié)束。每個(gè)“名稱”后跟一個(gè)“:”(冒號(hào))际看;“‘名稱/值’ 對(duì)”之間使用“,”(逗號(hào))分隔咸产。

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

值(value)可以是雙引號(hào)括起來(lái)的字符串(string)、數(shù)值(number)屑彻、true验庙、false、?null社牲、對(duì)象(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方法,因?yàn)間et方法如果其內(nèi)容為空會(huì)直接拋出異常阱当。不過(guò)JsonArray.opt*(index)會(huì)有越界問(wèn)題需要特別注意俏扩。

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 json解析及簡(jiǎn)單例子》

《Android學(xué)習(xí)筆記44:JSON數(shù)據(jù)解析》

四坤学、Android JSON解析庫(kù)

? ? ? ?上面介紹都是使用Android提供的原生類解析JSON,最大的好處是項(xiàng)目不需要引入第三方庫(kù)报慕,但是如果比較注重開發(fā)效率而且不在意應(yīng)用大小增加幾百K的話深浮,有以下JSON可供選擇:

1.Jackson

2.google-gson

3.Json-lib

《兩款JSON類庫(kù)Jackson與JSON-lib的性能對(duì)比(新增第三款測(cè)試)》

五、格式化工具

? ? ? 在日常開發(fā)中眠冈,如果涉及到與服務(wù)器端調(diào)試協(xié)議時(shí)飞苇,過(guò)程中難免遇到服務(wù)器端發(fā)送格式或者Android客戶端解析格式出現(xiàn)問(wèn)題,這時(shí)需要把獲取到的JSON打印出來(lái)進(jìn)行問(wèn)題定位,如果JSON比較短一眼就能看出來(lái)布卡,但是如果很長(zhǎng)的話想查找某一個(gè)字段或者JSON數(shù)組中某一位的值顯得特別困難雨让,想要擺脫這種苦惱也很簡(jiǎn)單,把JSON字符串格式化之后會(huì)發(fā)現(xiàn)苦惱瞬間無(wú)影無(wú)蹤羽利。以下是以我常用的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移動(dòng)開發(fā)技術(shù)文章_手機(jī)開發(fā) - 紅黑聯(lián)盟(三種解析方法)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市卷哩,隨后出現(xiàn)的幾起案子蛋辈,更是在濱河造成了極大的恐慌,老刑警劉巖将谊,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冷溶,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡尊浓,警方通過(guò)查閱死者的電腦和手機(jī)逞频,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)栋齿,“玉大人苗胀,你說(shuō)我怎么就攤上這事⊥叨拢” “怎么了基协?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)菇用。 經(jīng)常有香客問(wèn)我澜驮,道長(zhǎng),這世上最難降的妖魔是什么惋鸥? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任泉唁,我火速辦了婚禮,結(jié)果婚禮上揩慕,老公的妹妹穿的比我還像新娘亭畜。我一直安慰自己,他們只是感情好迎卤,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布拴鸵。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪劲藐。 梳的紋絲不亂的頭發(fā)上八堡,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音聘芜,去河邊找鬼兄渺。 笑死,一個(gè)胖子當(dāng)著我的面吹牛汰现,可吹牛的內(nèi)容都是我干的挂谍。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼瞎饲,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼口叙!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起嗅战,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤妄田,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后驮捍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疟呐,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年东且,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了萨醒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡苇倡,死狀恐怖富纸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情旨椒,我是刑警寧澤晓褪,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站综慎,受9級(jí)特大地震影響涣仿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜示惊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一好港、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧米罚,春花似錦钧汹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)碗降。三九已至,卻和暖如春塘秦,著一層夾襖步出監(jiān)牢的瞬間讼渊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工尊剔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留爪幻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓须误,卻偏偏與公主長(zhǎng)得像挨稿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子霹期,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • 1 反射機(jī)制&JSON解析 【 Java的高級(jí)特性:反射機(jī)制 publicclass Student { pu...
    征程_Journey閱讀 885評(píng)論 0 0
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,526評(píng)論 25 707
  • JOSN的定義: 一種輕量級(jí)的數(shù)據(jù)交換格式叶组,具有良好的可讀和便于快速編寫的特性拯田。業(yè)內(nèi)主流技術(shù)為其提供了完整的解決方...
    熱愛生活的男孩子閱讀 523評(píng)論 2 1
  • 今夏看到了第一個(gè)蟬蛻 晚秋聞到一絲菊香 就像春天遲遲沒(méi)有看到迎春花開放 冬天沒(méi)有聽到雪落聲 都不覺(jué)得是真正的季節(jié) ...
    夏光草木閱讀 32評(píng)論 6 6
  • 看了這么多的干貨历造,小編這次要放雞湯了,唉唉唉船庇,別走啊吭产,看完了再吐槽啊。 前幾天小編看了《小王子》覺(jué)得深有感觸鸭轮,當(dāng)然...
    被子哥閱讀 286評(píng)論 0 1