如何通过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("&", "&") .replace("<", "<") .replace(">", ">") .replace("\"", """) .replace("'", "'"); } }
步骤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 & < >", 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("&", "&") .replace("<", "<") .replace(">", ">") .replace("\"", """) .replace("'", "'"); } }
然后在POJO字段上使用:
public class FooJson { @JsonDeserialize(converter = XmlEscapeConverter.class) private String variable; // getter、setter省略 }
关键注意点
- 不要忘记转义所有XML特殊字符:
&、<、>、"、',只转义&会导致其他字符在后续XML处理中报错。 - 如果你的转义逻辑比较复杂,可以把转义逻辑抽成一个工具类,比如
XmlEscapeUtils.escape(String value),方便在反序列化器或Converter中复用。
内容的提问来源于stack exchange,提问作者Rumal
相关产品推荐
相关产品推荐

