ObjectMapper序列化String类型JSON字段出现转义符的解决方法
问题根因
实体类中json字段定义为String类型时,Jackson的ObjectMapper执行序列化会默认将字符串值按普通文本处理,自动对字符串内部的双引号做转义,不会识别字符串本身承载的JSON结构,最终就会出现带反斜杠转义、字段值被双引号包裹为普通字符串的结果。
可行解决方案
- 方案1:替换字段类型为JsonNode(生产环境首选,类型安全)
直接将json字段的类型从String替换为Jackson内置的JsonNode树类型,赋值时提前将JSON字符串解析为JsonNode对象,序列化时会自动按嵌套JSON结构输出,不需要额外配置,也能提前校验JSON格式合法性。- 修改实体类代码:
import com.fasterxml.jackson.databind.JsonNode; public class ClassSerializable { private Long id; private JsonNode json; // 生成对应getter、setter public Long getId() {return id;} public void setId(Long id) {this.id = id;} public JsonNode getJson() {return json;} public void setJson(JsonNode json) {this.json = json;} }
- 赋值与序列化逻辑:
ObjectMapper mapper = new ObjectMapper(); ClassSerializable obj = new ClassSerializable(); obj.setId(7L); // 把原始JSON字符串解析为JsonNode后赋值 String rawJsonContent = "{\"fieldJson\": {\"one\": 1, \"two\": 1}}"; JsonNode innerJson = mapper.readTree(rawJsonContent); obj.setJson(innerJson); // 执行序列化,直接输出无转义的目标结构 String targetJson = mapper.writeValueAsString(obj);
- 方案2:加@JsonRawValue注解(保留String字段类型时使用)
如果业务逻辑要求json字段必须保留String类型,直接在字段上添加@JsonRawValue注解,Jackson序列化该字段时会直接输出字符串的原始内容,不做转义、不额外包裹双引号。
实体类修改示例:
import com.fasterxml.jackson.annotation.JsonRawValue; public class ClassSerializable { private Long id; // 声明该字段值按原始JSON内容输出 @JsonRawValue private String json; // 生成对应getter、setter }
注意:使用该方案必须保证存入
json字段的字符串是合法JSON格式,否则最终输出的JSON会出现结构语法错误。如果需要支持反序列化时自动把嵌套JSON读为字符串,可以搭配自定义反序列化器实现。
- 方案3:全局序列化配置(非必要不推荐)
如果项目中所有存储JSON内容的String字段都需要按原始结构输出,可以给ObjectMapper配置全局String序列化规则,为String类型注册原始值序列化器。但该配置影响范围覆盖所有String字段,容易导致普通文本字符串序列化异常,除非有明确的全局需求,否则不建议使用。
以上方案执行后,序列化输出的结果即为期望的无多余转义的嵌套JSON结构:
{ "id": 7, "json": { "fieldJson": { "one": 1, "two": 1 } } }
内容的提问来源于stack exchange,提问作者wuttke
相关产品推荐
相关产品推荐

