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

Java使用XmlMapper转XML为JSON时首个根标签被跳过如何解决

XML转JSON时根标签丢失问题

问题现象

XML转JSON格式转换过程中,XML的首个根标签未被正常转换到最终生成的JSON结果中。

复现代码

String data="";
data = FileUtils.readFileToString(new File("src/main/resources/student.xml"), "UTF-8");
XmlMapper xmlMapper = new XmlMapper();
JsonNode jsonNode = xmlMapper.readTree(data.getBytes());
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.writerWithDefaultPrettyPrinter().writeValue(new File("src/main/resources/student.json"),jsonNode);

测试输入XML

<?xml version="1.0" encoding="utf-8"?>
<AccumulateResponse>
  <TestCase>
    <Transactionid>str1234</Transactionid>
    <TransactionType>str1234</TransactionType>
    <Status>str1234</Status>
  </TestCase>
  <TestCase>
    <Transactionid>str5678</Transactionid>
    <TransactionType>str5678</TransactionType>
    <Status>str5678</Status>
  </TestCase>
</AccumulateResponse>

实际输出JSON

{
  "TestCase": [
   {
    "Transactionid": "str1234",
    "TransactionType": "str1234",
    "Status": "str1234"
   },
   {
    "Transactionid": "str5678",
    "TransactionType": "str5678",
    "Status": "str5678"
   }
  ]
}

期望输出JSON

{
"AccumulateResponse": {
  "TestCase": [
   {
    "Transactionid": "str1234",
    "TransactionType": "str1234",
    "Status": "str1234"
   },
   {
    "Transactionid": "str5678",
    "TransactionType": "str5678",
    "Status": "str5678"
   }
  ]
 }
}

问题原因

Jackson的XmlMapper默认解析逻辑中,readTree()方法会直接返回XML根标签下的子节点内容,不会将根标签本身作为JSON结构的一层,因此最外层的AccumulateResponse标签会被跳过。

修复方案

不需要硬编码根节点名称,通过解析器自动获取根标签名后,手动封装一层外层节点即可,修改后的代码如下:

String data = FileUtils.readFileToString(new File("src/main/resources/student.xml"), "UTF-8");
XmlMapper xmlMapper = new XmlMapper();
// 创建XML解析器,自动读取根标签名称
JsonParser parser = xmlMapper.getFactory().createParser(data.getBytes("UTF-8"));
parser.nextToken();
String rootTagName = parser.currentName();
// 读取根标签下的内容节点
JsonNode contentNode = xmlMapper.readTree(parser);

ObjectMapper objectMapper = new ObjectMapper();
// 构造外层节点,将根标签作为key,内容节点作为值
ObjectNode finalNode = objectMapper.createObjectNode();
finalNode.set(rootTagName, contentNode);

// 输出最终JSON
objectMapper.writerWithDefaultPrettyPrinter()
        .writeValue(new File("src/main/resources/student.json"), finalNode);

运行修改后的代码,即可得到带根节点层级的预期JSON结果,该写法兼容任意名称的XML根标签,不需要提前固定根节点名。

内容的提问来源于stack exchange,提问作者mr. abhi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 12:01:14