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

XML转JSON时单元素数组处理:如何通过<?xml-multiple?>标记识别?

XML单元素数组节点转换解决方案

方案1:升级org.json依赖版本

<?xml-multiple [节点名]?>本身就是org.json库官方定义的XML处理指令,作用就是标记指定节点需强制转换为JSON数组,你遇到的单元素节点不识别的问题,绝大多数是由于使用的org.json版本过低,未支持该特性导致的。
将org.json依赖升级到2021年及之后发布的版本即可原生支持该指令,无需额外开发或更换库,示例代码如下:

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

public class XmlConvertTest {
    public static void main(String[] args) {
        // 填入你的XML字符串
        String xmlContent = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
                "<jsonObject>\n" +
                "   <data>\n" +
                "      <?xml-multiple accounts?>\n" +
                "      <accounts>\n" +
                "         <Id>123</Id>\n" +
                "         <creationDate>2021-10-21T15:43:00.12345Z</creationDate>\n" +
                "         <displayName>account_x</displayName>\n" +
                "      </accounts>\n" +
                "   </data>\n" +
                "   <links>\n" +
                "      <self>self</self>\n" +
                "      <first>first</first>\n" +
                "      <prev>prev</prev>\n" +
                "      <next>next</next>\n" +
                "      <last>last</last>\n" +
                "   </links>\n" +
                "   <meta>\n" +
                "      <totalRecords>10</totalRecords>\n" +
                "      <totalPages>10</totalPages>\n" +
                "   </meta>\n" +
                "</jsonObject>";
        JSONObject result = XML.toJSONObject(xmlContent);
        // 输出的accounts节点为数组类型
        System.out.println(result.toString(2));
    }
}

方案2:基于现有版本做后置处理

如果因项目限制无法升级org.json版本,可以通过预处理+后置修改的方式实现需求:

  • 第一步:提前解析XML中的处理指令,提取所有被<?xml-multiple?>标记的节点名称,存入集合
  • 第二步:调用XML.toJSONObject()完成基础转换
  • 第三步:遍历转换后的JSON结构,将标记为数组的节点统一包装为JSONArray类型,示例逻辑如下:
// 假设arrayNodes为预处理得到的需强制转数组的节点名集合,此处已包含"accounts"
JSONObject data = jsonObject.getJSONObject("jsonObject").getJSONObject("data");
Object accountsVal = data.get("accounts");
if (!(accountsVal instanceof JSONArray)) {
    JSONArray accountsArray = new JSONArray();
    accountsArray.put(accountsVal);
    data.put("accounts", accountsArray);
}

方案3:使用Jackson XML模块实现

如果你需要更换转换库,可以使用jackson-dataformat-xml,通过自定义配置实现相同效果:

  • 开启DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY配置,支持单元素自动转数组
  • 提前解析<?xml-multiple?>指令得到数组节点列表,配置XmlMapper的JavaType对应关系即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 22:45:06