JSON 转义 / 去转义

把文本变成可嵌入代码字符串的转义形式,或还原

JSON 转义:为什么你的 JSON 里出现了反斜杠

什么时候需要转义

JSON 字符串不能随便包含原始的特殊字符。反斜杠、双引号、以及所有控制字符(换行、制表、回车、退格等)必须写成转义序列:

转义含义说明
\"双引号不转义会提前结束字符串
\\反斜杠必须转义,否则会被当成转义前缀
\n换行正文里的真实换行是非法控制字符
\t制表符常见于粘贴的表格数据
\r回车Windows 换行是 \r\n
\b \f退格、换页少见但同样必须转义
\uXXXX任意 Unicode 字符四位十六进制,supplementary 字符需两个转义
\/斜杠合法但不必需,见下

\/ 是个历史遗留:规范允许转义斜杠,但绝不要求。它存在的理由是防止把 JSON 直接嵌进 HTML 时出现 </script> 而提前关闭脚本标签。现代实现通常不再转义斜杠,所以你看到 \/ 多半来自老系统或特定序列化库。

双重序列化:反斜杠爆炸的根源

如果一段 JSON 被当作字符串的值放进另一段 JSON,就会发生两次转义,肉眼看起来是一堆反斜杠:

层数内容
原始对象{"a":1}
转成字符串后嵌入(1 层)"{\"a\":1}"
再嵌一层(2 层)"{\"a\":\"{\\\"a\\\":1}\"}"

判断层数的实用方法:逐次去转义,看结果是不是又变成一段合法的 JSON。如果去一层得到的是字符串、去两层才是对象,说明是双重序列化。每个 \\ 代表一次序列化——数一下反斜杠的个数,大致就知道嵌了几层。

双重序列化的实际后果:接收方只解一次,拿到的是字符串而不是对象,字段访问全部失败;或者反序列化后字段类型与约定不符。修法要在产生数据的那一端(通常是拼接字符串的地方改成结构化序列化),而不是在消费端反复解。

和另外两种转义的区分

方案转义目标用在
JSON 转义JSON 字符串的语法安全JSON 值内部
URL 百分号编码URL 的语法安全查询参数、路径
HTML 实体编码HTML 的语法安全HTML 文本与属性

它们不能互相替代。把 JSON 放进 URL 参数要先按需做 URL 编码;把 JSON 放进 HTML 页面要做 HTML 转义(至少处理 < > &),否则 </script> 会直接终止脚本块,<!-- 会开启注释——这是 XSS 的经典入口,也是为什么现在推荐用 <script type="application/json"> 承载数据而不是内联成 JS 变量。

工具怎么用

两个方向:把含特殊字符的文本转成可安全嵌入 JSON 的形式(转义),或者把 \" \n \\ 这类序列还原成原始字符(去转义)。工具会在解码时严格校验转义序列的合法性,遇到 \x 这类不存在的转义会明确指出位置,而不是静默输出错误结果。

常见问题

转义后为什么外面多了一层引号?

因为 JSON 字符串本身就要用引号包裹。这层引号正是"可以作为字符串嵌入"的标志,去掉引号就不再是合法字符串了。

去转义失败怎么办?

确认输入是完整的 JSON 字符串字面量(含首尾引号)。如果只贴了内部内容,工具会尝试当作字符串处理;仍失败则内容本身不合法。