返回

使用 Jackson 将 XML 中的“&”解析为 Unicode 字符

java

用 Jackson 将 XML 中的“&”解析为 Unicode

问题陈述

当使用 Jackson-dataformat-xml 处理 XML 时,特殊字符“&”会被解析为“&”,导致在映射到 POJO 时转换为“\u0026”。这会导致意外的结果,例如将“Air B&B”读取为“Air B\u0026B”。

解决方法

要解决此问题,我们可以使用 Jackson 提供的 UnescapeStrategyUnescapeStrategy 允许自定义 Jackson 处理转义字符的方式。

实现

  1. 创建自定义 UnescapeStrategy
public class CustomUnescapeStrategy extends UnescapeStrategy {

    @Override
    public String unescape(String input) {
        return input.replaceAll("&", "&");
    }
}
  1. 注册自定义 UnescapeStrategy

在你的 Jackson 配置中,注册自定义的 UnescapeStrategy

ObjectMapper mapper = new ObjectMapper();
mapper.enable(Feature.UNWRAP_ROOT_VALUE);
mapper.setUnescapeStrategy(new CustomUnescapeStrategy());

额外提示

  • 启用 Feature.UNWRAP_ROOT_VALUE 以解析根元素为 POJO。
  • 可根据需要扩展 unescape() 方法,以反转义其他特殊字符。

示例

XML 输入:

<root>Air B&amp;B</root>

使用自定义 UnescapeStrategy 后的解析结果:

Air B&B

常见问题解答

  1. 为什么 Jackson 默认将“&”解析为“&”?
    Jackson 根据 XML 规范对特殊字符进行转义,该规范将“&”定义为“&”。

  2. 我可以将自定义 UnescapeStrategy 与哪些 Jackson 版本一起使用?
    自定义 UnescapeStrategy 可与 Jackson 2.x 及更高版本配合使用。

  3. 除了“&”之外,我还可以反转义哪些其他字符?
    你可以使用自定义 UnescapeStrategy 反转义任何所需的字符。

  4. 我是否需要处理 XML 中的所有转义字符?
    仅需处理需要在目标应用程序中保持原样的字符。

  5. 如何提高我的 UnescapeStrategy 的性能?
    可以使用正则表达式或字符查找算法来优化 unescape() 方法。