Java 实现多层XML转Json
准备工作
1.依赖包
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
2.xml样例
<?xml version="1.0" encoding="UTF-8"?>
<Message>
<Version>1.0</Version>
<Token>token-286756</Token>
<From>
<Address>
<Sys>TCIP</Sys>
</Address>
</From>
<To>
<Address>
<Sys>UTCS</Sys>
</Address>
</To>
<Type>REQUEST</Type>
<Seq>20210923160852334793</Seq>
<Body>
<Operation order="1" name="Get">
<SignalControler>
<SignalControlerID>530742904337-43825</SignalControlerID>
<Supplier>中国</Supplier>
<Type>12</Type>
<CrossIDList>
<CrossID>crossID-438403</CrossID>
<CrossID>crossID-470413</CrossID>
</CrossIDList>
<LampGroupNoList>
<LampGroupNo>48</LampGroupNo>
</LampGroupNoList>
</SignalControler>
</Operation>
</Body>
</Message>
工具类
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.dom4j.*;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class XMLUtil {
public static void main(String[] args) {
String xml ="<?xml version=\"1.0\" encoding=\"UTF-8\"?><Message><Version>1.0</Version><Token>token-197699</Token><From><Address><Sys>TCIP</Sys></Address></From><To><Address><Sys>UTCS</Sys></Address></To><Type>REQUEST</Type><Seq>20210918155221410244</Seq><Body><Operation order=\"1\" name=\"Get\"><SignalControler><SignalControlerID>537047424978-25922</SignalControlerID><Supplier>华录易云</Supplier><Type>12</Type><CrossIDList><CrossID>crossID-012086</CrossID><CrossID>crossID-881036</CrossID></CrossIDList><LampGroupNoList><LampGroupNo>82</LampGroupNo></LampGroupNoList></SignalControler></Operation></Body></Message>";
JSONObject json = xml2Json(xml);
System.out.println(json);
}
/**
* 将xml格式响应报文解析为Json格式
*
* @param responseXmlTemp
* @return
*/
public static JSONObject xml2Json(String responseXmlTemp) {
Document doc = null;
try {
doc = DocumentHelper.parseText(responseXmlTemp);
} catch (DocumentException e) {
System.out.println("parse text error : " + e);
}
Element rootElement = doc.getRootElement();
JSONObject json = elementToJSONObject(rootElement);
return json;
}
/**
* org.dom4j.Element 转 com.alibaba.fastjson.JSONObject
*
* @param node
* @return
*/
public static JSONObject elementToJSONObject(Element node) {
JSONObject result = new JSONObject();
// 当前节点的名称、文本内容和属性
List<Attribute> listAttr = node.attributes();// 当前节点的所有属性的list
for (Attribute attr : listAttr) {// 遍历当前节点的所有属性
result.put(attr.getName(), attr.getValue());
}
// 递归遍历当前节点所有的子节点
List<Element> listElement = node.elements();// 所有一级子节点的list
if (!listElement.isEmpty()) {
Set<String> collect = listElement.stream().map(element -> element.getName()).collect(Collectors.toSet());
long count = collect.stream().count();
int size = listElement.get(0).elements().size();
if (count != listElement.size() && size == 0) {
//最后一层节点,如果子节点名称相同,则将所有节点值作为数组放入同一个节点名称下,防止因节点名称相同覆盖
List<String> childList = listElement.stream().map(element -> element.getTextTrim()).collect(Collectors.toList());
result.put(listElement.get(0).getName(), childList);
} else {
for (Element e : listElement) {
// 遍历所有一级子节点
if (e.attributes().isEmpty() && e.elements().isEmpty()) { // 判断一级节点是否有属性和子节点
// 沒有则将当前节点作为上级节点的属性对待
result.put(e.getName(), e.getTextTrim());
} else {
if (e.getName().equals("CrossIDList")) {
System.out.println("目标");
}
if (!result.containsKey(e.getName())) { // 判断父节点是否存在该一级节点名称的属性
// 没有则创建
result.put(e.getName(), new JSONArray());
}
// 将该一级节点放入该节点名称的属性对应的值中
JSONObject child = elementToJSONObject(e);
((JSONArray) result.get(e.getName())).add(child);
}
}
}
}
return result;
}
}
执行结果:
{
"Type": "REQUEST",
"Version": "1.0",
"Token": "token-197699",
"From": [
{
"Address": [
{
"Sys": "TCIP"
}
]
}
],
"To": [
{
"Address": [
{
"Sys": "UTCS"
}
]
}
],
"Body": [
{
"Operation": [
{
"SignalControler": [
{
"Type": "12",
"SignalControlerID": "537047424978-25922",
"Supplier": "华录易云",
"CrossIDList": [
{
"CrossID": [
"crossID-012086",
"crossID-881036"
]
}
],
"LampGroupNoList": [
{
"LampGroupNo": "82"
}
]
}
],
"name": "Get",
"order": "1"
}
]
}
],
"Seq": "20210918155221410244"
}