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. 將每一層的keySe
t放入map
中在轉為json
5. 判斷json.get(key)是JSONArray
還是JSONObject
還是鍵值對模式
6. 遍歷json陣列,然後再次判斷,再遞迴
注:若轉載請標明出處。
相關推薦
JSON(帶json陣列)格式轉XML(多層巢狀,帶value)格式
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