1. 程式人生 > >JSON(帶json陣列)格式轉XML(多層巢狀,帶value)格式

JSON(帶json陣列)格式轉XML(多層巢狀,帶value)格式

1.JSON格式

隨便寫了一個,帶有json陣列,如下:

{
    "TxnBatchNo": "20170607152322",
    "TxnSeq": "1",
    "CardNo": "2017000100000003",
    "AAA": {
        "hello": "nihao",
        "hey": "hai",
        "world": "hee"
    },
    "BBB": [{
        "hello": "nihao",
        "hey": "hai",
        "people": [{
            "d": "dog"
, "c": "", "e": [{ "hello": "nihao", "hey": "hai", "tiger": [{ "d": "dog", "c": "", "e": "elepahant" }] }] }]
}]
}

2.JAVA程式碼

    public
static String jsonToXmlUtil(String jsonString) { if (!StringUtils.hasText(jsonString)) { log.error("{}", "請求引數不能為空"); throw new BizException("EEEEEE", "請求引數不能為空"); } JSONObject jsonObj = null; try { // 格式化JSON資料,將json字串轉化為JSONObject並將資料的key以字母順序排序
jsonObj = JSON.parseObject(jsonString); } catch (Exception e) { log.error("{}", "請求引數格式有誤"); throw new BizException("EEEEEE", "請求引數格式有誤"); } String xmlResult = null; // 建立dom物件 Document document = DocumentHelper.createDocument(); // 設定編碼格式 document.setXMLEncoding("utf-8"); // 新增父元素 Element addElement = document.addElement("Message"); // 新增子元素 Element thisElement = addElement.addElement("Public"); // 得到json資料中key的集合:[BBB, AAA, TxnSeq, TxnBatchNo, CardNo] Set<String> keySet = jsonObj.keySet(); Map<Object, Object> map = new HashMap<Object, Object>(keySet.size()); for (String key : keySet) { map.put(key, jsonObj.get(key)); // 將map轉為JSON格式 // {"AAA":[{"hello":"nihao","hey":"hai","world":[{"c":"cat","d":"dog","e":"elepahant"}]}]} JSONObject j = (JSONObject) JSON.toJSON(map); Element childrenElement = thisElement.addElement(key); // 判斷此時key的value是否是json陣列 Object json = JSON.toJSON(j.get(key)); if (json instanceof JSONArray) { // 處理json陣列 jsonArrayToXml((JSONArray) json, childrenElement); // 判斷此時key的value是JSONObject:{"hello":"nihao","hey":"hai","world":"oo"} } else if (json instanceof JSONObject) { JSONObject object = (JSONObject) JSON.toJSON(j.get(key)); for (String key2 : object.keySet()) { Element childrenElement2 = childrenElement.addElement(key2); // 再次判斷 if (JSON.toJSON(j.get(key2)) instanceof JSONArray) { jsonArrayToXml((JSONArray) JSON.toJSON(j.get(key2)), childrenElement2); } else { childrenElement2.addAttribute("value", object.getString(key2)); } } } else { // 不是json陣列則為key新增值 childrenElement.addAttribute("value", map.get(key).toString()); } } xmlResult = document.asXML(); return xmlResult; } /** * 處理json陣列 * @param jsonArray 傳入的json陣列 * @param childrenElement 上層的dom元素 */ public static void jsonArrayToXml(JSONArray jsonArray, Element childrenElement) { // 遍歷json陣列:[{"hello":"nihao","hey":"hai","world":[{"c":"cat","d":"dog","e":"elepahant"}]}] for (int i = 0; i < jsonArray.size(); i++) { // 以此例子為例:第一次遍歷獲取jsonArray.get(i) // {"hello":"nihao","hey":"hai","world":[{"c":"cat","d":"dog","e":"elepahant"}]} // 第二次遍歷:{"c":"cat","d":"dog","e":"elepahant"} // 將或得到的Object型別的字串轉化為json格式 JSONObject jsonObject = (JSONObject) jsonArray.get(i); // 繼續遍歷 for (String key : jsonObject.keySet()) { Element addElement = childrenElement.addElement(key); Object arry = JSON.toJSON(jsonObject.get(key)); if (arry instanceof JSONArray) { // 遞迴 jsonArrayToXml((JSONArray) arry, addElement); } else { addElement.addAttribute("value", jsonObject.get(key).toString()); } } } }

輸出結果

<?xml version="1.0" encoding="utf-8"?>
<Message><Public><BBB><hello value="nihao"/><hey value="hai"/><people><d value="dog"/><e><hello value="nihao"/><hey value="hai"/><tiger><d value="dog"/><e value="elepahant"/><c value=""/></tiger></e><c value=""/></people></BBB><AAA><hello value="nihao"/><hey value="hai"/><world value="hee"/></AAA><TxnSeq value="1"/><TxnBatchNo value="20170607152322"/><CardNo value="2017000100000003"/></Public></Message>

總結

對於多層巢狀,最重要的就是遞迴,其次就是迴圈邏輯,上述程式碼的迴圈我還覺得有些問題,好像有些邏輯有些複雜了,部落格寫完吧,開始修改。
目前邏輯:
1. 先建立dom物件新增父元素等。
2. 得到json串的Set集合
3. 遍歷Set集合
4. 將每一層的keySet放入map中在轉為json
5. 判斷json.get(key)是JSONArray還是JSONObject還是鍵值對模式
6. 遍歷json陣列,然後再次判斷,再遞迴

注:若轉載請標明出處。

相關推薦

JSONjson陣列格式XMLvalue格式

1.JSON格式 隨便寫了一個,帶有json陣列,如下: { "TxnBatchNo": "20170607152322", "TxnSeq": "1", "CardNo": "2017000100000003", "AA

JSON 陣列 value值 又是一個JSON陣列

[[{"typets": "1","ans": [{"tu": "3","ans": "","sc": "1"}, {"tu": "4","ans": "","sc": "1"}, {"tu": "7","ans": "","sc": "1"}, {"tu": "8","an

樹結構有id和pid欄位陣列生成json物件

/* * 傳入的陣列有id和父節點pid欄位,通過它們的關聯構造成一棵或多棵樹結構 * @param nodes 集合 * @param treeRootId 根節點的id */ function createTreeData(nodes, treeRo

手把手教你怎麼解析JSON資料使用JSONModel

使用API API介紹 參考的JSON資料(可能與你看到的不同) { "date": "20181020", "stories": [ { "title": "每週一吸 · 狸花貓",

gson處理的複雜形式的json

/** * 獲取當前房間引數資訊 * * @param houseid 房間ID * @param hashmap 成功失敗標誌 * @return 返回House引數資訊 * @throws UnsupportedEncodingExcept

Gson使用及 json 定義類

問題描述 對於簡單的Json資料,其對應的java bean 也比較簡單,尤其用GSON處理的時候。 但是如果是多層巢狀的json資料,如果是手工用JSONArray和JSONObject進行解析,還是可以的,雖然會繁瑣一點。但是如果用GSON開源庫解析,有

利用Gson解析JSON資料

資料例項: { "error": 0, "status": "success", "results": [ { "currentCity

fastJson解析報錯com.alibaba.fastjson.JSONException: create instance error, class json.TestFJson$A

今天用fastJson解析報 create instance error的錯誤 認真檢查,bean類內的欄位都和服務端返回的欄位一致,格式都是正確的,為什麼會報錯呢。 在網上找到答案,如果存在內嵌的情況: 比如public class A{

提取Json資料

在.net 2.0中提取這樣的json {"name":"lily","age":23,"addr":{"city":guangzhou,"province":guangdong}} 引用名稱空間 using Newtonsoft.Json; using Newtonsoft

C#處理Json字串、Json物件、

1.C#    public partial class WebForm2 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) {

關於python中列表的遍歷和拆開自用

假設存在列表形如 list_1 = [[1, 2], [3, 4, 5], [6, 7], [8], [9]] ,則 使用遍歷查詢列表元素 list_1 = [[1, 2], [3, 4, 5], [6, 7], [8], [9]]; for

table表格table採坑!重複描邊相容問題

你肯定會說table還要解決相容問題,你搞笑啊~~ 是的,一開始我也會這樣說,但那是在只有一個table狀況下,咋折騰都沒問題,直到有一天。。。 先說說為什麼要巢狀table,常規情況下我們用一個table就能解決問題,拆分及合併單元格可以用到rowspan

前端傳送的json解析

日前同事問及我jQuery 傳送JSON資料到後臺,後臺該如何接收的問題,經多方查閱,總結出了以下方法: 前臺要用到json2.js和jquery.js 後臺要用到json.jar。 在前端要將傳的JSON資料使用JSON.stringify(這裡是json資料)轉

Android 動態生成佈局

前段時間學習了android,瞭解到android主要是使用xml佈局檔案進行佈局的,但是對於一些動態的介面,就需要使用程式碼動態生成佈局。 Android 除了可以載入xml檔案,顯示佈局外,也可以程式碼生成佈局,並通過setContentView(View view)

mongodb update陣列解決辦法

version: 3.4.3 { "_id" : 1 "user_id": 1, "message" : "Yes" "translations" : [ { "destination" : "fr", "text

微信小程式迴圈二級陣列遍歷

小程式中的遍歷迴圈類似於angularJS的遍歷。 二級陣列遍歷有一個坑。二級遍歷wx:for迴圈的時候,需要注意。(程式碼如下) JS程式碼: data: { groups: [ [ {

python 的方法

#跳轉 #Python 不支援 goto 和 label,想要在多層巢狀迴圈中跳轉,稍稍有些麻煩。最簡單的做法 #是設定跳轉標誌,並在相應位置檢查。 def test(): stop = False while True: while Tru

JSON(不json陣列)XML層層,xml格式value格式

廢話不多說,直接上程式碼 /** * 處理json資料 * @param jsonString */ public static String jsonToXmlUtil(String json

vue專案中使用bpmn-流程圖json屬性xml七篇更新完成

內容概述 本系列“vue專案中使用bpmn-xxxx”分為七篇,均為自己使用過程中用到的例項,手工原創,目前陸續更新中。主要包括vue專案中bpmn使用例項、應用技巧、基本知識點總結和需要注意事項,具有一定的參考價值,需要的朋友可以參考一下。如果轉載或通過爬蟲直接爬的,格式特別醜,請

【已解決】qlv格式mp4騰訊視訊

今天老婆單位上電視臺了,領導讓她們技術科把網路上的視訊下載下來。咋辦? (1)一開始,想著從瀏覽器快取找,弄了一通,IE、火狐、谷歌瀏覽器、360瀏覽器都不行,清理快取後從新播放還是不行。無奈,我猜可能是這個網站設定無快取吧。 http://v.yltvb.com/shi