Java 实现多层XML转Json

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"
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值