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

