使用Gson序列化Employee列表存入Org模型时如何消除多余转义反斜杠
出现多余反斜杠的核心原因
当前输出中双引号前自动添加反斜杠的问题,本质是嵌套序列化层级与字段类型定义不匹配:
- Org模型中的
employee字段被定义为String类型,JSON序列化框架处理Org对象时,会将该字段值作为普通纯文本处理,自动对内容内的双引号做转义 - 提前用Gson将
List<Employee>转成的JSON字符串,本身是带结构化双引号的JSON片段,但因为它被存入String类型的employee字段,外层序列化时会被强制转义为字符串格式,最终就生成了带反斜杠的错误结构。
现有两种方案的缺陷
- 方案1完全遵循默认序列化规则,从类型定义阶段就不匹配预期的输出结构,必然会触发自动转义
- 方案2的正则替换去反斜杠的思路完全失效:哪怕在业务代码里临时删除了反斜杠,外层序列化框架在处理String类型字段时,依然会重新给所有双引号添加转义,甚至可能因为转义逻辑不匹配生成结构非法的JSON。
可落地的正确解决方法
从根源避免多余转义,不能靠手动修改字符串内容,要从类型定义和序列化规则适配层面调整:
- 首推方案:调整Org模型的字段类型
把employee字段的类型从String改为List<Employee>,直接将业务层拿到的employeeList赋值给该字段即可,不需要提前做JSON序列化。这是REST接口最规范的写法,序列化逻辑完全统一,最终输出的JSON结构和预期完全一致。
调整后的模型代码参考:
业务层赋值代码参考:public class Org { // 替换原String类型的employee字段 private List<Employee> employee; // 配套的getter、setter方法 ... }List<Employee> employeeList = getEmployeesList(..); org.setEmployee(employeeList); - 兼容方案:保留String类型字段的定制处理
如果因为历史兼容原因不能修改Org的字段类型,可以给序列化框架添加规则,指定该字段存储的是已经序列化好的JSON片段,不需要做转义处理。
以Spring生态默认使用的Jackson序列化框架为例,只需在employee字段上添加@JsonRawValue注解,序列化时就会直接输出字段存储的原始JSON内容,不对双引号做转义:
这种场景下,再用Gson将employeeList转成JSON字符串set进字段,最终输出的结构就不会出现多余的反斜杠转义。public class Org { @com.fasterxml.jackson.annotation.JsonRawValue private String employee; ... }
注意:绝对不要使用手动正则替换反斜杠的方案,这类操作非常脆弱,一旦字符串本身存在需要转义的特殊字符(比如员工姓名包含双引号),就会直接破坏JSON结构,引发线上解析错误。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

