如何仅用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
相关产品推荐
相关产品推荐

