将 JSON 转义为字符串字面量(并解码双重编码的 JSON)

对 JSON 进行 stringify 时,会用双引号包裹并转义内部引号与特殊字符,得到可安全嵌入到其他位置的 JSON 字符串字面量。

「转义成字面量」是什么意思

把一个 JSON 字符串传给 JSON.stringify,会用双引号把它包起来,并对内部的引号与反斜杠做转义,得到一个可以安全嵌入的单个字符串值。

什么时候需要它

把 JSON 嵌入到另一份 JSON 的字段里、存进字符串类型的数据库列、或者作为环境变量或 URL 参数传递时,都需要先转义成字符串字面量。

转义规则

双引号用反斜杠转义,反斜杠加倍,换行、tab 等控制字符变成两字符的转义序列。结果里不会出现原始的换行。

解码被双重编码的 JSON

如果收到一个以转义引号开头、内部包含转义引号序列的字符串,说明它被 stringify 过。先 parse 一次还原内部 JSON 字符串,再 parse 一次拿到真正的值。

双重编码常出现在哪里

把上下文对象序列化的日志框架、把 JSON body 包在 'body' 字段里的 webhook、用「JSON 字符串信封」传输的消息队列,以及类型为 text 或 varchar 的数据库列,都是最常见的来源。看到开头一个引号加偶数个反斜杠就是信号。

在日志里处理嵌入的 JSON

结构化日志通常把对象 stringify 成一行。要查看时,把那一行从日志查看器里复制出来,用 JSON.parse 解掉转义,再把还原的 JSON 格式化。不要去 grep 多行的 JSON 对象 —— stringify 成一行的 JSON 更容易搜索。

完成往返的工具

浏览器控制台:JSON.parse(line) 取回内部 JSON,再 JSON.stringify(...,null,2) 美化。Node 命令行:'node -e "console.log(JSON.parse(process.argv[1]))" "<line>"' 一次完成。本站的 JSON Stringify 工具能一键处理任意深度的嵌套。