1. 程式人生 > >xml(帶屬性)轉json格式

xml(帶屬性)轉json格式

小記

這裡用的是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裡面之後不知道怎麼記著這個節點位置,而且還要遞迴,遞迴完之後再mapjson或者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格式。

注:轉載請說明出處。