JAVA :JSONObject转换为XML

开发的项目需要「一套数据,两种格式」:对外同时提供 JSON 接口和 XML 接口。那就需要将JSON对象转化为XML对象。

依赖

复制代码
<dependency>
    <groupId>org.dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>2.1.4</version>
</dependency>
<dependency>
    <groupId>com.alibaba.fastjson2</groupId>
    <artifactId>fastjson2</artifactId>
    <version>2.0.51</version>
</dependency>

完整工具类,支持 JSONObject、嵌套对象、数组,输出完整xml文档:

复制代码
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

import java.io.StringWriter;

public class Json2XmlUtil {

    /**
     * JSONObject转完整XML字符串
     * @param jsonObject json对象
     * @param rootName 根节点名称
     * @return xml完整字符串
     */
    public static String jsonToXml(JSONObject jsonObject, String rootName) {
        Document document = DocumentHelper.createDocument();
        // xml声明头 <?xml version="1.0" encoding="UTF-8"?>
        document.setXMLEncoding("UTF-8");
        Element root = document.addElement(rootName);
        parseJsonObject(jsonObject, root);

        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setIndent("  ");
        format.setNewlines(true);
        StringWriter writer = new StringWriter();
        try (XMLWriter xmlWriter = new XMLWriter(writer, format)) {
            xmlWriter.write(document);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return writer.toString();
    }

    /**
     * 递归解析JSONObject
     */
    private static void parseJsonObject(JSONObject jsonObj, Element parent) {
        for (String key : jsonObj.keySet()) {
            Object value = jsonObj.get(key);
            if (value instanceof JSONObject jo) {
                Element child = parent.addElement(key);
                parseJsonObject(jo, child);
            } else if (value instanceof JSONArray ja) {
                parseJsonArray(ja, parent, key);
            } else {
                // 普通文本值
                parent.addElement(key).setText(value == null ? "" : value.toString());
            }
        }
    }

    /**
     * 解析JSON数组
     */
    private static void parseJsonArray(JSONArray jsonArray, Element parent, String arrayKey) {
        for (int i = 0; i < jsonArray.size(); i++) {
            Object item = jsonArray.get(i);
            if (item instanceof JSONObject jo) {
                Element itemEle = parent.addElement(arrayKey);
                parseJsonObject(jo, itemEle);
            } else {
                parent.addElement(arrayKey).setText(item == null ? "" : item.toString());
            }
        }
    }

    // test
    public static void main(String[] args) {
        String json = "{\n" +
                "  \"userName\":\"李四\",\n" +
                "  \"hobby\":[\"篮球\",\"游泳\"],\n" +
                "  \"info\":{\"email\":\"test@xx.com\"}\n" +
                "}";
        JSONObject jsonObject = JSONObject.parseObject(json);
        String xmlResult = jsonToXml(jsonObject, "root");
        System.out.println(xmlResult);
    }
}

输出示例:

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <userName>李四</userName>
  <hobby>篮球</hobby>
  <hobby>游泳</hobby>
  <info>
    <email>test@xx.com</email>
  </info>
</root>

接口示例

复制代码
    @PostMapping(value = "/rest-xml/{path}/{version}", produces = MediaType.APPLICATION_ATOM_XML_VALUE)
    @Operation(summary = "RESTful XML调用", description = "外部系统调用RESTful XML接口")
    public String restXml(
            @Valid @PathVariable String path,
            @Valid @PathVariable String version,
            @RequestBody Object request) {
        // 根据path、version找到API
        // 根据API调用Service
        // 根据返回类型,输出XML
        return externalService.restXml(path, version, request);
    }

public String restXml(@Valid String path, @Valid String version, Object request) {
        log.info("外部系统调用 restXml 接口,name={}, version={}", path, version);

        // 用 restJson 的逻辑,返回JSON结果对象
        JSONObject result = new JSONObject();
        try {
            JSONObject data = restJson(path, version, request);
            if (data != null && data.containsKey("code") && data.getInteger("code") != 200) {
                result.put("status", data.getInteger("code"));
                result.put("message", data.getString("message"));
            } else {
                result.put("data", data);
                result.put("status", 200);
                result.put("message", "success");
            }
            return jsonToXmlUtils.jsonToXml(result, "response");
        } catch (Exception e) {
            log.error("JSON 转 XML 失败", e);
            result.put("status", 500);
            result.put("message", "JSON 转 XML 失败:" + e.getMessage());
            return jsonToXmlUtils.jsonToXml(result, "response");
        }
    }
    ```
相关推荐
阿图灵14 分钟前
LangGraph 实战 03:Workflows 与 Agents——六种工作流模式与智能体实战(附 6 个可运行示例)
java·前端·javascript·工作流·ai agent·智能体·langgraph
海拥✘15 分钟前
网页抓取 API 稳定性怎么测?用 Dataify 完成一次真实压测
python
databook16 分钟前
几何分布:从“等一个结果”开始
python·数据挖掘·数据分析
程序员三明治20 分钟前
【体验毛坯房】Deep Harness 入门教程
java·人工智能·后端·大模型·llm·deepseek·dsh
zzzll111120 分钟前
深入理解 Java HashMap:从原理到实战
java·开发语言·哈希算法
猫猫不是喵喵.28 分钟前
Java开发高频面试题汇总(通俗易懂版)
java·开发语言·java高频面试
用户03321266636730 分钟前
如何在 Python 环境中裁剪 PDF 页面
python
威联通网络存储33 分钟前
TS-h2287XU-RP 在医药制造批记录与合规归档场景的部署
python·制造
我命由我1234538 分钟前
Android 设备的日志缓冲区被写满,logcat: Unexpected EOF!
android·java·java-ee·android studio·android jetpack·android-studio·android runtime