如何在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(">"); case '"' -> new SerializedString("""); case '\'' -> new SerializedString("'"); 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: < > & " '</data> </HashMap>
额外说明
为什么默认不转义>、"、'?这是因为XML规范里:
>只有在元素内容中出现]]>时才必须转义,其他场景可选;"和'只有在作为属性值的分隔符时才会被自动转义,文本内容里默认不处理。
但通过自定义转义器,我们可以强制统一转义所有5个字符,满足你的特定需求。
内容来源于stack exchange
相关产品推荐
相关产品推荐

