You need to enable JavaScript to run this app. 使用Gson序列化Employee列表存入Org模型时如何消除多余转义反斜杠
优惠活动
大模型
产品
解决方案
定价
更多

使用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内容,不对双引号做转义:
    public class Org {
       @com.fasterxml.jackson.annotation.JsonRawValue
       private String employee;
       ...
    }
    
    这种场景下,再用Gson将employeeList转成JSON字符串set进字段,最终输出的结构就不会出现多余的反斜杠转义。

注意:绝对不要使用手动正则替换反斜杠的方案,这类操作非常脆弱,一旦字符串本身存在需要转义的特殊字符(比如员工姓名包含双引号),就会直接破坏JSON结构,引发线上解析错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.06 03:24:05