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

如何通过Jackson ObjectMapper转义JSON转POJO时的XML特殊字符?

解决Jackson反序列化JSON到POJO时转义XML特殊字符的问题

你之前尝试的CharacterEscapes其实是Jackson用来序列化POJO到JSON字符串时控制字符转义的配置,而你现在是在反序列化JSON到POJO的阶段,所以这个配置完全不会生效——这就是为什么你的测试没通过的核心原因。

要在JSON转POJO的过程中转义XML特殊字符,我们需要从反序列化环节入手,下面是几种可行的方案:

方案1:自定义String类型反序列化器

创建一个针对String类型的自定义反序列化器,在反序列化时自动转义XML特殊字符:

步骤1:实现自定义反序列化器

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;

import java.io.IOException;

public class XmlEscapeStringDeserializer extends StdDeserializer<String> {

    public XmlEscapeStringDeserializer() {
        super(String.class);
    }

    @Override
    public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        String original = p.getValueAsString();
        if (original == null) {
            return null;
        }
        // 转义所有XML特殊字符:&、<、>、"、'
        return original.replace("&", "&amp;")
                       .replace("<", "&lt;")
                       .replace(">", "&gt;")
                       .replace("\"", "&quot;")
                       .replace("'", "&apos;");
    }
}

步骤2:注册反序列化器到ObjectMapper

如果需要全局生效(所有String字段都转义):

@Test
public void testGlobalDeserializer() throws IOException {
    ObjectMapper objectMapper = Jackson.newObjectMapper();
    // 注册自定义String反序列化器
    SimpleModule module = new SimpleModule();
    module.addDeserializer(String.class, new XmlEscapeStringDeserializer());
    objectMapper.registerModule(module);

    String json = "{\"variable\":\"a string with & < >\"}";
    FooJson fooJson = objectMapper.readValue(json, FooJson.class);
    assertEquals("a string with &amp; &lt; &gt;", fooJson.getVariable());
}

如果只需要特定字段生效,直接在POJO字段上用@JsonDeserialize注解:

public class FooJson {
    @JsonDeserialize(using = XmlEscapeStringDeserializer.class)
    private String variable;

    // getter、setter省略
}

方案2:使用Jackson Converter

如果希望更灵活地处理字符串转换(比如可以复用转义逻辑),可以用Converter:

import com.fasterxml.jackson.databind.util.StdConverter;

public class XmlEscapeConverter extends StdConverter<String, String> {
    @Override
    public String convert(String value) {
        if (value == null) {
            return null;
        }
        return value.replace("&", "&amp;")
                   .replace("<", "&lt;")
                   .replace(">", "&gt;")
                   .replace("\"", "&quot;")
                   .replace("'", "&apos;");
    }
}

然后在POJO字段上使用:

public class FooJson {
    @JsonDeserialize(converter = XmlEscapeConverter.class)
    private String variable;

    // getter、setter省略
}

关键注意点

  • 不要忘记转义所有XML特殊字符:&、<、>、"、',只转义&会导致其他字符在后续XML处理中报错。
  • 如果你的转义逻辑比较复杂,可以把转义逻辑抽成一个工具类,比如XmlEscapeUtils.escape(String value),方便在反序列化器或Converter中复用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:30:09