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="\"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>
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也能转成功,很棒!!!