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

如何在Java中使用Jackson的XmlMapper进行JSON转XML时正确转义特殊字符

如何在Java中使用Jackson的XmlMapper进行JSON转XML时正确转义特殊字符

嗨,我完全懂你遇到的问题——用Jackson的XmlMapper做JSON转XML转换时,发现<和&能自动转义,但>、"、'这三个字符却没被处理,对吧?别着急,我来给你一步步解决这个问题。

首先得明确:XmlMapper的默认转义规则是遵循XML基础规范的,其中<和&属于必须转义的字符,所以默认就处理了;但>、双引号、单引号在某些XML上下文里是可选转义的,因此默认配置没有强制转义它们。如果我们需要严格转义你列出的全部5个特殊字符,就得自定义XmlMapper的字符转义规则。

解决方案:自定义字符转义器

我们可以通过继承Jackson的CharacterEscapes类,覆盖默认的转义逻辑,强制让XmlMapper转义所有5个目标字符。下面是完整的实现代码:

1. 定义自定义字符转义类

这个类会指定每个需要转义的字符对应的XML实体:

import com.fasterxml.jackson.core.io.CharacterEscapes;
import com.fasterxml.jackson.core.io.SerializedString;

public class CustomXmlCharacterEscapes extends CharacterEscapes {
    private final int[] asciiEscapes;

    public CustomXmlCharacterEscapes() {
        // 先复用XML默认的ASCII转义规则(已经处理了<和&)
        asciiEscapes = CharacterEscapes.standardAsciiEscapesForXML();
        // 把>、"、'加入强制转义的列表
        asciiEscapes['>'] = CharacterEscapes.ESCAPE_CUSTOM;
        asciiEscapes['"'] = CharacterEscapes.ESCAPE_CUSTOM;
        asciiEscapes['\''] = CharacterEscapes.ESCAPE_CUSTOM;
    }

    @Override
    public int[] getEscapeCodesForAscii() {
        return asciiEscapes;
    }

    @Override
    public SerializedString getEscapeSequence(int ch) {
        // 返回每个字符对应的XML转义实体
        return switch (ch) {
            case '>' -> new SerializedString("&gt;");
            case '"' -> new SerializedString("&quot;");
            case '\'' -> new SerializedString("&apos;");
            default -> super.getEscapeSequence(ch);
        };
    }
}

2. 配置XmlMapper并测试转换

接下来,我们需要把自定义的转义器配置到XmlMapper中,然后进行JSON转XML的测试:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator;

public class JsonXmlConverterDemo {
    public static void main(String[] args) throws Exception {
        // 构建配置好自定义转义规则的XmlMapper
        XmlMapper xmlMapper = XmlMapper.builder()
                // 可选:是否写入XML声明,根据你的需求调整
                .configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true)
                // 关键步骤:注入自定义字符转义器
                .factory(xmlGen -> {
                    xmlGen.setCharacterEscapes(new CustomXmlCharacterEscapes());
                    return xmlGen;
                })
                .build();

        // 测试用的JSON内容,包含所有5个特殊字符
        String testJson = "{\"data\": \"Test chars: < > & \\\" '\"}";
        Object jsonObject = new ObjectMapper().readValue(testJson, Object.class);

        // 执行转换并打印结果
        String xmlResult = xmlMapper.writeValueAsString(jsonObject);
        System.out.println(xmlResult);
    }
}

运行结果

执行后你会看到所有特殊字符都被正确转义:

<?xml version='1.0' encoding='UTF-8'?>
<HashMap>
  <data>Test chars: &lt; &gt; &amp; &quot; &apos;</data>
</HashMap>

额外说明

为什么默认不转义>、"、'?这是因为XML规范里:

  • >只有在元素内容中出现]]>时才必须转义,其他场景可选;
  • "和'只有在作为属性值的分隔符时才会被自动转义,文本内容里默认不处理。

但通过自定义转义器,我们可以强制统一转义所有5个字符,满足你的特定需求。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 13:22:57