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

Springboot中如何移除JSON转XML时生成的多余
字符

解决XmlMapper转XML时出现多余 字符的问题

问题场景

我使用Jackson的XmlMapper.writeValueAsString()方法将JSON对象转换为XML,但转换后的XML里,TxtValue字段出现了多余的
字符(对应JSON里的\r回车符),希望移除这些字符并保留正常换行。

相关代码、输入输出如下:

转换代码:

XmlMapper xmlMapper = new XmlMapper();
String xml = "";

xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
xmlMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);

try {
    xml = xmlMapper.writeValueAsString(inputJsonObject);
}catch (Exception e){
    e.printStackTrace();
    throw new Exception("Error!");
}

输入JSON:

{
     "Atribut": [
            {
                "RnatrId": 71945793,
                "TxtValue": "AssetId: 545654, Aktiviran: DA\r\nCustomerName: John Wick\r\nDSLAM Pozicija: Dawa_daslkads 342",
                "NumValue": 0,
                "DateValue": "",
                "MultiselectId": "",
                "MultiselectTxt": ""
            }
     ]
}

转换后XML(含多余
):

<Atribut>
   <RnatrId>71945793</RnatrId>
   <TxtValue>
        AssetId: 545654, Aktiviran: DA&#xd;
        CustomerName: John Wick&#xd;
        DSLAM Pozicija: Dawa_daslkads 342&#xd;
   </TxtValue>
    <NumValue>0</NumValue>
    <DateValue></DateValue>
    <MultiselectId></MultiselectId>
    <MultiselectTxt></MultiselectTxt>
</Atribut>

期望输出XML:

<Atribut>
       <RnatrId>71945793</RnatrId>
       <TxtValue>
            AssetId: 545654, Aktiviran: DA
            CustomerName: John Wick
            DSLAM Pozicija: Dawa_daslkads 342
       </TxtValue>
        <NumValue>0</NumValue>
        <DateValue></DateValue>
        <MultiselectId></MultiselectId>
        <MultiselectTxt></MultiselectTxt>
    </Atribut>

解决方案

方案1:预处理JSON中的回车符

在转换前直接修改JSON里的TxtValue字段,把所有\r字符移除:

如果使用org.json.JSONObject:

// 遍历Atribut数组,处理每个对象的TxtValue
JSONArray atributArray = inputJsonObject.getJSONArray("Atribut");
for (int i = 0; i < atributArray.length(); i++) {
    JSONObject atribut = atributArray.getJSONObject(i);
    String txtValue = atribut.getString("TxtValue");
    // 替换所有\r为空
    txtValue = txtValue.replace("\r", "");
    atribut.put("TxtValue", txtValue);
}

// 执行转换
xml = xmlMapper.writeValueAsString(inputJsonObject);

如果使用Jackson的ObjectNode:

ArrayNode atributArray = (ArrayNode) inputJsonObject.get("Atribut");
for (JsonNode node : atributArray) {
    ObjectNode atribut = (ObjectNode) node;
    String txtValue = atribut.get("TxtValue").asText();
    txtValue = txtValue.replace("\r", "");
    atribut.put("TxtValue", txtValue);
}

方案2:配置XmlMapper禁用回车符转义

Jackson的XmlMapper默认会把\r转义为&#xd;,可以通过关闭ToXmlGenerator.Feature.ESCAPE_CR特性来解决:

XmlMapper xmlMapper = new XmlMapper();
// 禁用回车符的XML实体转义
xmlMapper.configure(ToXmlGenerator.Feature.ESCAPE_CR, false);

// 保留原有反序列化配置
xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
xmlMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);

try {
    xml = xmlMapper.writeValueAsString(inputJsonObject);
}catch (Exception e){
    e.printStackTrace();
    throw new Exception("Error!");
}

这个配置会让XmlMapper在序列化时不对\r进行转义,\r\n会直接被处理为正常换行,不会生成&#xd;实体。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 15:37:06