Java如何像Python一樣簡(jiǎn)潔地構(gòu)造和解析Json 數(shù)據(jù)

身為一名 Java 程序員亦歉,如果要處理 Json 數(shù)據(jù)飞袋,你大抵聽說過下面一些類庫: Jackson , google gson , json-lib , flexjson , json-io , genson , fastjson 。不過鳖链,咪博士在這里不打算和大家探討這些類庫的性能問題(網(wǎng)絡(luò)上已經(jīng)有許多關(guān)于這些 Json 類庫的性能比較,請(qǐng)自行 Google)。咪博士想和大家說的是境蔼,在用 Java 進(jìn)行 Json 數(shù)據(jù)的構(gòu)造和解析時(shí)灶平,如果寫出像動(dòng)態(tài)語言(如Python)一樣,簡(jiǎn)潔箍土、優(yōu)雅的代碼逢享。

答案是:使用 mjson 類庫!

你可以在MVN Repository中找到它

http://mvnrepository.com/artifact/org.sharegov/mjson

不說廢話吴藻,直接上代碼瞒爬,然后聽咪博士同大家細(xì)細(xì)分享。

首先沟堡,請(qǐng)牢記侧但,mjson 中最重要的類就是 Json,幾乎所有的操作和數(shù)據(jù)都圍繞著 Json 類展開航罗。

實(shí)例1:構(gòu)造簡(jiǎn)單的Json數(shù)據(jù)

13 行:使用 Json.object() 開始構(gòu)造一個(gè)JsonObject禀横,要添加屬性-值,只需要不斷地調(diào)用其 set 方法粥血。重點(diǎn)是 set 方法返回類型也是 Json柏锄,所以,你可以像示例代碼中那樣复亏,直接多次串聯(lián)調(diào)用 set 方法趾娃,代碼相當(dāng)簡(jiǎn)潔。

16 行:怎么把 Json 對(duì)象轉(zhuǎn)換成符合Json格式的字符串呢缔御?沒錯(cuò)茫舶!就用大家最熟悉的toString 方法,就是這么簡(jiǎn)單刹淌。

21 行:?如果我有一個(gè)符合 Json 格式的字符串饶氏,我要如何構(gòu)造相應(yīng)的Json 對(duì)象呢?答案是使用 read 方法有勾,mjson 會(huì)幫你搞定一切的疹启。

實(shí)例2:解析簡(jiǎn)單的Json數(shù)據(jù)

44 行:?判斷一個(gè) JsonObject 是否包含某一屬性,使用 has 方法

47 行:獲取某個(gè)屬性的值蔼卡,先使用at 方法喊崖,得到相應(yīng)的Json對(duì)象,然后再根據(jù)具體的數(shù)據(jù)類型雇逞,調(diào)用類似 asXXX 方法荤懂。例如,字符串類型就調(diào)用 asString 方法塘砸;整型就調(diào)用 asInteger 方法节仿。

實(shí)例3:構(gòu)造復(fù)雜(嵌套)的Json數(shù)據(jù)

mjson中構(gòu)造 JsonArray 有2種方法:

(1) 使用 Json.array(),然后掉蔬,多次串聯(lián)調(diào)用 add 方法廊宪,往Json 數(shù)據(jù)中添加元素 (例如 63 行代碼)

(2) 使用 Java 標(biāo)準(zhǔn)的數(shù)據(jù)類型矾瘾,如 Map, List 等,然后在設(shè)置屬性值的時(shí)候箭启,直接使用 Map 或 List壕翩。mjson 會(huì)非常聰明地把它們轉(zhuǎn)換為 JsonArray(例如 73 行代碼)

實(shí)例4: 解析復(fù)雜(嵌套)的Json數(shù)據(jù)

mjson 中解析 JsonArray 也有2種方法:

(1) 如果每個(gè)數(shù)組元素,又是一個(gè) JsonObject傅寡,調(diào)用 asJsonList 方法放妈,得到 List<Json> 列表,然后上一個(gè) for 循環(huán)荐操,你就可以為所欲為了大猛。(參考:95 - 99 行代碼)

(2) 如果每個(gè)數(shù)組元素,只是一些簡(jiǎn)單的數(shù)據(jù)類型淀零,如字符串等挽绩,不包含更復(fù)雜的結(jié)構(gòu),那么就先調(diào)用 asList 方法驾中,得到 List<Object> 列表唉堪,同樣用一個(gè) for 循環(huán),依次遍歷處理這些列表元素即可肩民。當(dāng)然唠亚,請(qǐng)不要忘了將列表元素拆箱成你需要數(shù)據(jù)類型。(參考:104 - 107 行代碼)

咪博士小結(jié):

1. 如 mjson 作者所言持痰,當(dāng)初其在項(xiàng)目中使用 json 在前端和后臺(tái)程序間傳遞數(shù)據(jù)灶搜,前端對(duì) json 數(shù)據(jù)的處理,十分簡(jiǎn)潔工窍,而后端使用 Java 處理 Json割卖,總是無比繁瑣。他尋遍整個(gè)互聯(lián)網(wǎng)患雏,竟然找不到一個(gè)簡(jiǎn)潔易用的 Json 處理類庫鹏溯,于是就模仿動(dòng)態(tài)語言,編寫了 mjson淹仑。

2. mjson 的主要優(yōu)勢(shì)在于代碼簡(jiǎn)潔丙挽,速度方面并沒做嚴(yán)格的測(cè)試,但對(duì)于絕大多數(shù)項(xiàng)目匀借,json 的處理應(yīng)該不會(huì)成為多大的性能瓶頸颜阐,有興趣的朋友可以做下性能測(cè)試。

3. mjson 尤其擅長處理格式不固定的 Json 數(shù)據(jù)吓肋。Java 中其他的 Json 類庫凳怨,基本都是在 bean 和 json 之間來回倒騰,其基本假設(shè)是你的 Json 數(shù)據(jù)格式是固定不變的蓬坡。而在一些應(yīng)用場(chǎng)景中猿棉,例如 Restful 服務(wù)中磅叛,Json 格式往往是不斷變化的屑咳,這個(gè)時(shí)候萨赁,就到了 mjson 大顯身手的時(shí)候了(事實(shí)上,mjson的作者當(dāng)時(shí)做的項(xiàng)目就是 Restful 服務(wù))兆龙。

學(xué)習(xí)Java的同學(xué)注意了U人!紫皇!
學(xué)習(xí)過程中遇到什么問題或者想獲取學(xué)習(xí)資源的話慰安,歡迎加入Java學(xué)習(xí)交流群346942462,我們一起學(xué)Java聪铺!


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末化焕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子铃剔,更是在濱河造成了極大的恐慌撒桨,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件键兜,死亡現(xiàn)場(chǎng)離奇詭異凤类,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)普气,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門谜疤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人现诀,你說我怎么就攤上這事夷磕。” “怎么了仔沿?”我有些...
    開封第一講書人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵企锌,是天一觀的道長。 經(jīng)常有香客問我于未,道長撕攒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任烘浦,我火速辦了婚禮抖坪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘闷叉。我一直安慰自己擦俐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開白布握侧。 她就那樣靜靜地躺著蚯瞧,像睡著了一般嘿期。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上埋合,一...
    開封第一講書人閱讀 51,245評(píng)論 1 299
  • 那天备徐,我揣著相機(jī)與錄音,去河邊找鬼甚颂。 笑死蜜猾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的振诬。 我是一名探鬼主播蹭睡,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼赶么!你這毒婦竟也來了肩豁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤辫呻,失蹤者是張志新(化名)和其女友劉穎清钥,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體印屁,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡循捺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了雄人。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片从橘。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖础钠,靈堂內(nèi)的尸體忽然破棺而出恰力,到底是詐尸還是另有隱情,我是刑警寧澤旗吁,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布踩萎,位于F島的核電站,受9級(jí)特大地震影響很钓,放射性物質(zhì)發(fā)生泄漏香府。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一码倦、第九天 我趴在偏房一處隱蔽的房頂上張望企孩。 院中可真熱鬧,春花似錦袁稽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至胁编,卻和暖如春鳞尔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背市框。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來泰國打工枫振, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留萤彩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓杖小,卻偏偏與公主長得像愚墓,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子扫腺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

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