xml(带属性)转json格式

3 篇文章 0 订阅

小记

这里用的是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格式。


注:转载请说明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值