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
相关产品推荐
相关产品推荐

