身為一名 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聪铺!