如何使用Jackson为JSON双引号加转义并反序列化为Map<String,String>
可行实现方案
完全可以实现,核心是区分清楚标准JSON转义和Java字符串字面量转义两个层级的逻辑,你给出的期望输出是两层转义叠加的结果,不是Jackson原生JSON序列化的标准输出,按以下步骤实现即可:
- 第一步:Jackson原生就支持直接反序列化为
Map<String, String>类型,只要输入是合法JSON即可。如果原始JSON里HTML内容的属性双引号没有做JSON层转义导致解析报错,可以开启Jackson的容错解析特性,或者提前预处理原始内容补全JSON层的转义,避免语法歧义。 - 第二步:要得到你期望的带反斜杠转义的输出,只需要在Jackson完成标准JSON序列化后,再额外做一层Java字符串层面的转义即可,不需要修改Jackson的序列化核心逻辑。你看到的输出里的多反斜杠、长字符串
+拼接,分别是二次转义、IDE自动格式化长字符串的效果,不是转义逻辑本身生成的。
核心实现代码
import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.Map; public class JacksonEscapeDemo { public static void main(String[] args) throws Exception { ObjectMapper objectMapper = new ObjectMapper(); // 按需开启容错特性,适配非严格格式的JSON输入 objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true); // 原始输入JSON(HTML解码后的实际内容) String rawJson = "{\"test1\":\"<p>Please click here <a href=\\\"https://google.com\\\">click here</a> for details</p>\",\"test2\":\"<p><br data-mce-bogus=\\\"1\\\"></p>\"}"; // 直接反序列化为目标Map类型 Map<String, String> targetMap = objectMapper.readValue(rawJson, new TypeReference<Map<String, String>>() {}); // 先序列化为标准格式JSON String standardJson = objectMapper.writeValueAsString(targetMap); // 二次转义为Java字符串字面量格式,不需要额外依赖,手动替换即可 String escapedOutput = standardJson.replace("\\", "\\\\").replace("\"", "\\\""); // 输出的escapedOutput就是你需要的转义后内容,如果需要按长度拆分为+拼接的格式,自行做字符串截断即可 System.out.println(escapedOutput); } }
注意事项
- 如果原始输入的JSON完全没有转义HTML内的双引号(比如
href="https://xxx"的双引号直接裸露在JSON值中),本质属于非法JSON格式,开启容错特性也可能存在解析歧义,最稳妥的方式是在生成JSON阶段就对值内的双引号做标准转义,从源头保证JSON合法性。 - 二次转义的逻辑非常简单,不需要引入第三方依赖,手动替换反斜杠和双引号就可以达到你要的效果。
内容的提问来源于stack exchange,提问作者Remo
相关产品推荐
相关产品推荐

