java:xml数据转json

pom.xml引入的jar

xml解析使用dom4j

        <!--xml解析-->
        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.1.36</version>

        </dependency>

1.创建xml转json工具类XmlToJsonUtil.java

package com.example.gxy.utils;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.dom4j.*;

import java.util.List;

/**
 * @ClassName XmlToJsonUtil
 * @Author gxy
 * @Desc xml转json
 */
public class XmlToJsonUtil {

    private XmlToJsonUtil(){
        
    }
    /**
     * xml转json
     *
     * @param xmlStr
     * @return
     * @throws DocumentException
     */
    public static JSONObject xml2Json(String xmlStr) {
        Document doc = null;
        try {
            doc = DocumentHelper.parseText(xmlStr);
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        JSONObject json = new JSONObject();
        dom4j2Json(doc.getRootElement(), json);
        return json;
    }

    /**
     * xml转json
     *
     * @param element
     * @param json
     */
    private static void dom4j2Json(Element element, JSONObject json) {
        // 如果是属性
        for (Object o : element.attributes()) {
            Attribute attr = (Attribute) o;
            if (StringUtils.isNotBlank(attr.getValue())) {
                json.put("@" + attr.getName(), attr.getValue());
            }
        }
        List<Element> chdEl = element.elements();
        if (chdEl.isEmpty() && StringUtils.isNotBlank(element.getText())) {// 如果没有子元素,只有一个值
            json.put(element.getName(), element.getText());
        }
        for (Element e : chdEl) {// 有子元素
            if (!e.elements().isEmpty()) {// 子元素也有子元素
                JSONObject chdjson = new JSONObject();
                dom4j2Json(e, chdjson);
                Object o = json.get(e.getName());
                if (o != null) {
                    JSONArray jsona = null;
                    if (o instanceof JSONObject) {// 如果此元素已存在,则转为jsonArray
                        JSONObject jsono = (JSONObject) o;
                        json.remove(e.getName());
                        jsona = new JSONArray();
                        jsona.add(jsono);
                        jsona.add(chdjson);
                    }
                    if (o instanceof JSONArray) {
                        jsona = (JSONArray) o;
                        jsona.add(chdjson);
                    }
                    json.put(e.getName(), jsona);
                } else {
                    if (!chdjson.isEmpty()) {
                        json.put(e.getName(), chdjson);
                    }
                }
            } else {// 子元素没有子元素
                for (Object o : element.attributes()) {
                    Attribute attr = (Attribute) o;
                    if (StringUtils.isNotBlank(attr.getValue())) {
                        json.put("@" + attr.getName(), attr.getValue());
                    }
                }
                if (!e.getText().isEmpty()) {
                    json.put(e.getName(), e.getText());
                }
            }
        }
    }
}

2.测试

xml文件

<?xml version="\&quot;1.0\&quot;" encoding="\&quot;utf-8\&quot;"?>
<res>
    <header>
        <msgId>0000211</msgId>
        <hdlSts>A</hdlSts>
        <bdFlg>0</bdFlg>
    </header>
    <body>
        <qrOvertimeFlag>Y</qrOvertimeFlag>
        <orderTrans>
            <tranSeq>66807478</tranSeq>
            <merchantNo>104320553990088</merchantNo>
            <orderNo>2439665</orderNo>
            <custTranId></custTranId>
            <tranCode>01</tranCode>
            <tranTime>20190704134549</tranTime>
            <tranAmount>0.01</tranAmount>
            <tranStatus>1</tranStatus>
            <unionPaySeq></unionPaySeq>
        </orderTrans>
        <orderTrans>
            <tranSeq>66807491</tranSeq>
            <merchantNo>104320553990088</merchantNo>
            <orderNo>2439665</orderNo>
            <custTranId>1043205539900882439665</custTranId>
            <tranCode>06</tranCode>
            <tranTime>20190704163313</tranTime>
            <tranAmount>0.01</tranAmount>
            <tranStatus>2</tranStatus>
            <unionPaySeq></unionPaySeq>
        </orderTrans>
        <orderTrans>
            <tranSeq>66807492</tranSeq>
            <merchantNo>104320553990088</merchantNo>
            <orderNo>2439665</orderNo>
            <custTranId>1043205539900882439665</custTranId>
            <tranCode>06</tranCode>
            <tranTime>20190704163414</tranTime>
            <tranAmount>0.01</tranAmount>
            <tranStatus>2</tranStatus>
            <unionPaySeq></unionPaySeq>
        </orderTrans>
        <orderTrans>
            <tranSeq>66807495</tranSeq>
            <merchantNo>104320553990088</merchantNo>
            <orderNo>2439665</orderNo>
            <custTranId>1043205539900882439665</custTranId>
            <tranCode>06</tranCode>
            <tranTime>20190705092338</tranTime>
            <tranAmount>0.01</tranAmount>
            <tranStatus>1</tranStatus>
            <unionPaySeq></unionPaySeq>
        </orderTrans>
    </body>
</res>

 main方法调用

    public static void main(String[] args) {

        String returnObj ="<?xml version=\"1.0\" encoding=\"utf-8\" ?><res><header><msgId>0000211</msgId><hdlSts>A</hdlSts><bdFlg>0</bdFlg></header><body><qrOvertimeFlag>Y</qrOvertimeFlag><orderTrans><tranSeq>66807478</tranSeq><merchantNo>104320553990088</merchantNo><orderNo>2439665</orderNo><custTranId></custTranId><tranCode>01</tranCode><tranTime>20190704134549</tranTime><tranAmount>0.01</tranAmount><tranStatus>1</tranStatus><unionPaySeq></unionPaySeq></orderTrans><orderTrans><tranSeq>66807491</tranSeq><merchantNo>104320553990088</merchantNo><orderNo>2439665</orderNo><custTranId>1043205539900882439665</custTranId><tranCode>06</tranCode><tranTime>20190704163313</tranTime><tranAmount>0.01</tranAmount><tranStatus>2</tranStatus><unionPaySeq></unionPaySeq></orderTrans><orderTrans><tranSeq>66807492</tranSeq><merchantNo>104320553990088</merchantNo><orderNo>2439665</orderNo><custTranId>1043205539900882439665</custTranId><tranCode>06</tranCode><tranTime>20190704163414</tranTime><tranAmount>0.01</tranAmount><tranStatus>2</tranStatus><unionPaySeq></unionPaySeq></orderTrans><orderTrans><tranSeq>66807495</tranSeq><merchantNo>104320553990088</merchantNo><orderNo>2439665</orderNo><custTranId>1043205539900882439665</custTranId><tranCode>06</tranCode><tranTime>20190705092338</tranTime><tranAmount>0.01</tranAmount><tranStatus>1</tranStatus><unionPaySeq></unionPaySeq></orderTrans></body></res>";

        JSONObject jsonObject1 = XmlToJsonUtil.xml2Json(returnObj);
        System.out.println(jsonObject1);
    }

 3.结果

{
    "header":{
        "msgId":"0000211",
        "hdlSts":"A",
        "bdFlg":"0"
    },
    "body":{
        "orderTrans":[
            {
                "tranSeq":"66807478",
                "tranTime":"20190704134549",
                "orderNo":"2439665",
                "tranCode":"01",
                "tranAmount":"0.01",
                "merchantNo":"104320553990088",
                "tranStatus":"1"
            },
            {
                "tranSeq":"66807491",
                "tranTime":"20190704163313",
                "orderNo":"2439665",
                "custTranId":"1043205539900882439665",
                "tranCode":"06",
                "tranAmount":"0.01",
                "merchantNo":"104320553990088",
                "tranStatus":"2"
            },
            {
                "tranSeq":"66807492",
                "tranTime":"20190704163414",
                "orderNo":"2439665",
                "custTranId":"1043205539900882439665",
                "tranCode":"06",
                "tranAmount":"0.01",
                "merchantNo":"104320553990088",
                "tranStatus":"2"
            },
            {
                "tranSeq":"66807495",
                "tranTime":"20190705092338",
                "orderNo":"2439665",
                "custTranId":"1043205539900882439665",
                "tranCode":"06",
                "tranAmount":"0.01",
                "merchantNo":"104320553990088",
                "tranStatus":"1"
            }
        ],
        "qrOvertimeFlag":"Y"
    }
}

复杂的xml也能转成功,很棒!!!

  • 9
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值