xml(帶屬性)轉json格式
阿新 • • 發佈:2019-02-09
小記
這裡用的是fastjson
xml轉json可給我折騰苦了,首先不是正常的xml格式<a>123</a>
,而是<a value = "123" />
,如果只是單層巢狀,例如:
<Message><Public><a value="123" /><b value = "456" /><c value = "789" /></Public></Message>
,這種的還好說,迴圈一下結束戰鬥
目前是這種樣子的xml格式,例如:
<Message><Public><a value="123" /><b value = "456" /><Hello><World><c value = "789" /><d value = "101" /></World></Hello></Public></Message>
我先說下我的思路(行不通),首先直接獲取
Element publicEle = document.getRootElement().element("Public");
之後開始轉jsonObject然後開始迴圈,將每個節點放入map裡面,然後遞迴,再然後map轉json,有個地方卡殼了,如果在這個地方,例:
<Hello><World><c value = "789" /><d value = "101"></World></Hello>
<Hello>
中是沒有value
屬性的,所以不能放到map裡面,可能需要放到List
List
裡面之後不知道怎麼記著這個節點位置,而且還要遞迴,遞迴完之後再map
轉json
或者list
放入map
中,總之是行不通,轉換不了。
換一個思路,換一個,既然這是特殊格式的xml,那麼咱們就把特殊格式的xml轉為正常格式的xml,然後再將正常的xml轉為json。
下面放程式碼:
//放幾個必要的
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
public static String xml3Json(String xmlStr) throws DocumentException {
Document document = DocumentHelper.parseText(xmlStr);
Element publicEle = document.getRootElement().element("Public");
xmlToJsonList(publicEle);
String asXML = publicEle.asXML();
//正常模式的xml快速轉json格式
org.json.JSONObject jsonObject = XML.toJSONObject(asXML);
JSONObject json = (JSONObject) JSON.parse(jsonObject.toString());
return json.get("Public").toString();
}
@SuppressWarnings("unchecked")
public static void xmlToJsonList(Element publicEle) {
List<Element> elements = publicEle.elements();
for(Element element : elements){
if(element.attribute("value") != null){
//先得到該值
String value = element.attributeValue("value");
//再去除value屬性
element.remove(element.attribute("value"));
//再為該節點新增值
element.setText(value);
}else{
//遞迴
xmlToJsonList(element);
}
}
}
測試:
public static void main(String[] args) throws DocumentException {
String x1="<?xml version=\"1.0\" encoding=\"GB18030\"?><Message><Public><TxnCode value=\"CT02\" /><aaaa><SiteID value=\"00000001\" /><bbbb><TermID value=\"\" /><ffff><gggg><hhhh><tttt value=\"你好\" /></hhhh></gggg></ffff></bbbb><TxnBatchNo value=\"20170607152322\" /></aaaa><TxnSeq value=\"1\" /><TlrNo value=\"01\" /><CardNo value=\"2017000100000003\" /><Amt value=\"0.01\" /><OprType value=\"01\" /><RelTxnSsn value=\"IPEM00000000320170607152231\" /></Public></Message>";
System.out.println(xml3Json(x1));
}
輸出(格式化後的):
{
"Amt": 0.01,
"CardNo": 2017000100000003,
"OprType": "01",
"RelTxnSsn": "IPEM00000000320170607152231",
"TlrNo": "01",
"TxnCode": "CT02",
"TxnSeq": 1,
"aaaa": {
"SiteID": "00000001",
"TxnBatchNo": 20170607152322,
"bbbb": {
"TermID": "",
"ffff": {
"gggg": {
"hhhh": {
"tttt": "你好"
}
}
}
}
}
}
這樣就暫時搞定了,不過還需要研究一下xml正常模式轉json格式。
注:轉載請說明出處。