總結(jié)下最近的工作遇到的點(diǎn):
入?yún)?fù)雜 JSON 層層嵌套弯菊,Java 怎么優(yōu)雅的處理研底。
一董济、關(guān)于 JSON
JSON 是類似 XML 用于存儲和交互文本信息步清。但優(yōu)于 XML ,其更小虏肾,更快廓啊,更易懂和解析。其是一個無序的”名稱/值”對的集合封豪。由
{ 左括號
""名稱 String
:
值
} 右括號
組成谴轮。然后 名稱值對 以逗號分隔。
二吹埠、場景描述
是一個正則匹配替換的操作第步。一個很長很復(fù)雜的 JSON 入?yún)ⅲㄟ^正則匹配其 content 對應(yīng)的值中的圖片地址并替換缘琅。
三粘都、思考
框架選型 – fastjson
(fastjson 是一個性能很好的 Java 語言實(shí)現(xiàn)的 JSON 解析器和生成器,來自阿里巴巴的工程師開發(fā)胯杭。)
a . 思路
Java 是面向?qū)ο蟮恼Z言驯杜。我要利用 fastjson 把復(fù)雜的 JSON 寫出其對應(yīng)的 BO 對象,然后正則替換 content 內(nèi)容(即 operatorContent 方法)做个,然后重新生成 JSON 響應(yīng)鸽心。即下面代碼操作:
OperatorBO operatorBO = JSON.parseObject(jsonString, OperatorBO.class);
operatorBO.setContent(operatorContent(operatorBO.getContent()));
String newJsonString = JSON.toJSONString(operatorBO);
好處:代碼易讀,容易維護(hù)
壞處:BO 實(shí)在是太復(fù)雜居暖,而且很多數(shù)組嵌數(shù)組顽频。PHP -> Java 服務(wù)化過程中很多不可控,容易出 BUG太闺。
涉及的API :
序列化對象到 JSON:
String jsonString = JSON.toJSONString(obj);
反序列化 JSON 到對象:
VO vo = JSON.parseObject("...", VO.class);
摘要: 原創(chuàng)出處:www.bysocket.com 泥瓦匠BYSocket 希望轉(zhuǎn)載糯景,保留摘要,謝謝省骂!
b . 思路
只是替換操作蟀淮,所以不用太考慮代碼易讀性。直接利用 fastjson 直接轉(zhuǎn)出 JSONArray 對象钞澳,然后操作該對象即可怠惶。JSONArray 對象本質(zhì)就是一個 List 如下代碼:
publicclassJSONArrayextendsJSON {
privatefinalList list;
protectedtransientObject relatedArray;
}
具體偽代碼如下:
String jsonString ="[{"+"\"content\":\"content value 1\""+"}]";
JSONArray itemDataJsonArr = JSON.parseArray(jsonString);
String content = itemDataJsonArr.getJSONObject(0).getString("content");
content = content +"23";
itemDataJsonArr.getJSONObject(0).put(CONTENT,content);
好處:不用關(guān)心其他復(fù)雜的鍵值對,目標(biāo)只關(guān)注要替換的節(jié)點(diǎn)名稱轧粟。
壞處:代碼不易讀策治,相對也還容易維護(hù)。
涉及的API :
替換對應(yīng)的節(jié)點(diǎn)名稱的值:
JSONObject.put("...",value);
反序列化 JSON 到 JSONArray 對象:
JSONArray jSONArray = JSON.parseObject("...");
思路 c d e …
四兰吟、小結(jié)
根據(jù)服務(wù)化場景通惫,在不確定入?yún)?JSON 的復(fù)雜度情況下,選擇了思路 b.這篇其實(shí)是工作上的小小結(jié)混蔼。任何技術(shù)履腋,任何框架的 API 是否好用優(yōu)雅,是具體場景決定的惭嚣。
如以上文章或鏈接對你有幫助的話遵湖,別忘了在文章結(jié)尾處評論哈~ 你也可以點(diǎn)擊頁面右邊“分享”懸浮按鈕哦,讓更多的人閱讀這篇文章料按。