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

如何在Java中将单个XML节点转换为JSONArray以兼容Java Bean定义

解决org.json中XML单节点转JSON对象而非数组的问题

我之前也碰到过一模一样的棘手问题——org.json的XML转JSON默认会根据节点数量自动切换对象/数组格式,单个节点转成对象、多个转成数组,这直接导致Java Bean的属性定义没法同时兼容两种情况。这里有两个实用的解决方案:

方案一:转换时强制指定节点为数组(推荐)

org.json从较早版本开始(你使用的20180813版本完全支持)提供了XMLParserConfiguration类,能配置强制将指定节点转为数组,不管它实际包含多少个子节点。

修改你的转换代码如下:

import org.json.XML;
import org.json.XMLParserConfiguration;
import java.util.Arrays;
import java.util.HashSet;

// 创建配置对象,指定需要强制转为数组的节点名
XMLParserConfiguration config = new XMLParserConfiguration();
config.setForceArray(new HashSet<>(Arrays.asList("Result"))); // 这里指定Result节点

// 使用带配置的方法完成XML转JSON
JSONObject companyDetailJson = XML.toJSONObject(responseXML, config);

这样处理后,不管你的XML里<Result>下有几个<MatchResult>,转换后的JSON中Result都会是数组格式,完全匹配你的期望输出。

方案二:转换后手动修正JSON结构

如果因为某些限制没法修改转换配置,也可以在转换完成后手动检查并调整JSON结构:

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

JSONObject companyDetailJson = XML.toJSONObject(responseXML);
JSONObject reponseXml = companyDetailJson.getJSONObject("ReponseXML");

// 检查Result的类型,若为单个对象则包装成数组
if (reponseXml.get("Result") instanceof JSONObject) {
    JSONObject singleResult = reponseXml.getJSONObject("Result");
    JSONArray resultArray = new JSONArray();
    resultArray.put(singleResult);
    reponseXml.put("Result", resultArray);
}

这个方法的思路是先获取ReponseXML对象,判断Result的类型,如果是JSONObject就把它放进JSONArray中,再替换原来的Result值。

两种方法都能解决你的问题:方案一更优雅,一步到位;方案二更灵活,适合需要动态判断的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 21:29:05