You need to enable JavaScript to run this app. 如何仅用Gson将Map转换为双引号已转义的JSON字符串,无需手动替换?
优惠活动
大模型
产品
解决方案
定价
更多

如何仅用Gson将Map转换为双引号已转义的JSON字符串,无需手动替换?

核心结论

完全可以借助Gson的内置序列化能力实现目标转义效果,不需要手动全局替换双引号,且这种实现比手动替换的可靠性高得多。
本质上你需要的转义效果,就是Gson在序列化字符串类型Java对象时,自动按JSON规则完成内部双引号转义的标准原生行为,不需要额外自定义逻辑。

具体实现方案
  • 第一步:和原有逻辑保持一致,使用Gson将你的Java Map结构序列化为不带内部转义的基础合法JSON字符串
  • 第二步:将第一步得到的基础JSON字符串,作为一个普通的字符串值,再次传入Gson的toJson方法执行序列化。这个过程中Gson会自动按照JSON字符串的转义规则,把字符串内部所有的双引号添加反斜杠转义
  • 第三步:Gson序列化字符串时会自动在整个字符串外层添加一对包裹用的双引号,只需要截取去掉首尾这两个固定位置的双引号,就得到你预期的最终字符串
完整代码示例
import com.google.gson.Gson;
import java.util.Map;

public class GsonEscapeDemo {
    public static void main(String[] args) {
        // 定义和你的结构完全一致的不可变Map
        Map<String, Object> myMap = Map.of(
            "key1", "value1",
            "key2", Map.of(
                "key2-1", "value2-1",
                "key2-2", 22
            )
        );
        
        Gson gson = new Gson();
        // 第一步:将Map序列化为基础JSON字符串
        String baseJson = gson.toJson(myMap);
        // 第二步:将基础JSON字符串作为普通值二次序列化,自动生成合规转义
        String serializedStr = gson.toJson(baseJson);
        // 去掉二次序列化自动添加的首尾包裹双引号,得到目标字符串
        String expected = serializedStr.substring(1, serializedStr.length() - 1);
        
        System.out.println(expected);
        // 实际输出完全匹配预期:{\"key1\":\"value1\",\"key2\":{\"key2-1\":\"value2-1\",\"key2-2\":22}}
    }
}
方案优势
  • 转义规则完全遵循官方JSON规范,彻底避免手动全局替换双引号带来的过度转义问题:如果原JSON中的值本身包含双引号、反斜杠等特殊字符,手动全局替换会破坏原有的正确转义结构,而Gson内置的转义逻辑可以正确处理所有边界情况
  • 所有转义逻辑完全由Gson内置实现,不需要自行维护替换规则,降低编码出错概率
  • 最后一步的截取操作是针对固定位置的字符,不存在模糊匹配、误替换的风险
  • 转义覆盖范围比手动替换更广,除双引号外,还会自动处理反斜杠、换行符、制表符、Unicode特殊字符等所有需要按JSON规则转义的内容,适配各类场景的转义要求
  • 整个流程没有额外反射、自定义逻辑引入的性能开销,和手动替换的方案性能基本持平

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.10 02:45:04