You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用org.json转换JSON数组为XML的格式修正问题咨询

解决org.json转换JSON数组到XML时生成重复父标签的问题

使用org.json框架将复杂JSON对象转换为XML时,JSON数组的转换结果不符合预期——数组元素会生成多个与数组键名相同的标签(比如多个<cars>),期望将所有数组元素包裹在一个<cars>标签内,每个元素用<item>标签封装。

原因分析

org.json的XML.toString()方法默认行为是将JSON数组的每个元素都生成一个与数组键名一致的XML标签,这导致了重复的父标签。要实现单父标签包裹+子元素<item>的结构,需要修改框架对数组元素的标签命名规则。

解决方案1:全局设置数组元素标签名

org.json提供了静态变量XML.arrayElementName,可以全局设置数组元素的默认标签名。设置后,所有JSON数组转换为XML时,元素都会用指定的标签包裹,父数组标签只会出现一次。

依赖配置(pom.xml)

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20231013</version>
</dependency>

示例代码

import org.json.JSONArray;
import org.json.JSONObject;
import org.json.XML;

public class JsonToXmlConverter {
    public static void main(String[] args) {
        // 构建测试JSON对象
        JSONObject root = new JSONObject();
        JSONArray carsArray = new JSONArray();
        
        carsArray.put(new JSONObject().put("brand", "Toyota").put("model", "Camry"));
        carsArray.put(new JSONObject().put("brand", "Honda").put("model", "Accord"));
        
        root.put("cars", carsArray);
        
        // 设置数组元素的标签为<item>
        XML.arrayElementName = "item";
        
        // 转换为XML
        String xmlResult = XML.toString(root);
        System.out.println(xmlResult);
    }
}

输出结果

<cars><item><brand>Toyota</brand><model>Camry</model></item><item><brand>Honda</brand><model>Accord</model></item></cars>

解决方案2:局部处理特定数组(避免全局影响)

如果应用中有多个数组需要不同的元素标签,全局设置会导致冲突,此时可以手动处理目标数组的XML转换:

import org.json.JSONArray;
import org.json.JSONObject;
import org.json.XML;

public class JsonToXmlConverter {
    public static void main(String[] args) {
        JSONObject root = new JSONObject();
        JSONArray carsArray = new JSONArray();
        
        carsArray.put(new JSONObject().put("brand", "Toyota").put("model", "Camry"));
        carsArray.put(new JSONObject().put("brand", "Honda").put("model", "Accord"));
        
        // 手动构建cars的XML片段
        StringBuilder carsXml = new StringBuilder("<cars>");
        for (int i = 0; i < carsArray.length(); i++) {
            JSONObject car = carsArray.getJSONObject(i);
            // 每个元素用<item>包裹
            carsXml.append("<item>").append(XML.toString(car)).append("</item>");
        }
        carsXml.append("</cars>");
        
        // 处理其他非数组属性(如果有)
        JSONObject otherProps = new JSONObject();
        otherProps.put("owner", "John Doe");
        String otherXml = XML.toString(otherProps);
        
        // 拼接最终XML
        String finalXml = String.format("%s%s", otherXml, carsXml);
        System.out.println(finalXml);
    }
}

输出结果

<owner>John Doe</owner><cars><item><brand>Toyota</brand><model>Camry</model></item><item><brand>Honda</brand><model>Accord</model></item></cars>

可选:格式化XML输出

org.json生成的XML是压缩格式,如果需要带缩进的格式化输出,可以借助JDK的XML转换工具:

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.json.JSONObject;
import org.json.XML;
import org.w3c.dom.Document;

public class FormattedXmlConverter {
    public static void main(String[] args) throws Exception {
        JSONObject root = new JSONObject();
        JSONArray carsArray = new JSONArray();
        carsArray.put(new JSONObject().put("brand", "Toyota").put("model", "Camry"));
        carsArray.put(new JSONObject().put("brand", "Honda").put("model", "Accord"));
        root.put("cars", carsArray);
        
        XML.arrayElementName = "item";
        String unformattedXml = XML.toString(root);
        
        // 解析XML并格式化
        Document doc = XML.toJSONObject(unformattedXml).toXML();
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
        
        StreamResult result = new StreamResult(System.out);
        transformer.transform(new DOMSource(doc), result);
    }
}

格式化输出

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<cars>
    <item>
        <brand>Toyota</brand>
        <model>Camry</model>
    </item>
    <item>
        <brand>Honda</brand>
        <model>Accord</model>
    </item>
</cars>

内容的提问来源于stack exchange,提问作者user10053673

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 03:17:10