JSON 转义与去转义怎么用:别把反斜杠片段当成完整字符串
一段内容里出现 \",不一定就是一份可以直接解析的 JSON 字符串。当前 JSON 工具的“转义”按钮会处理引号和反斜杠,但本次实测没有自动在整段内容外面加上双引号。生成的转义片段,与完整的外层 JSON 字符串,要分开理解。
下面用一段包含路径的公开样例,检查转义前后各有哪一层。操作前保存原文,每一步单独观察,不要连续点击直到所有反斜杠消失。
先保留一份有效的对象文本
打开“JSON格式化”,粘贴:
{"message":"demo","path":"C:\\demo"}
这是一份对象形式的 JSON 文本。路径值中两个反斜杠是 JSON 字符串里对单个反斜杠的表示,不能把它们直接视为多余字符。

此时最外层是花括号,message 和 path 是对象成员。之后做转义时,我们处理的是这整段 JSON 文本,不是单独修改 path 字段的业务值。
转义按钮产生的是片段
点击“转义”,本次编辑器变为:
{\"message\":\"demo\",\"path\":\"C:\\\\demo\"}
原来用于 JSON 结构的双引号前面增加了反斜杠,路径中的反斜杠也增加了层数。但整段最外面没有新添一对双引号。

直接对这份片段点击“校验 / 格式化”,本次出现第 1 行解析错误,提示期望键名或右花括号。原因在于它开头仍被按对象读取,但花括号后面出现的是反斜杠,不是正常对象键名的起始双引号。

这里的报错不代表原始对象坏了,而是当前片段所处的层次不符合直接按 JSON 对象解析的条件。保存原文和每一步结果,比反复删反斜杠更容易定位。
完整的外层 JSON 字符串长什么样
本例在转义片段外面各加一个双引号,得到完整的 JSON 字符串文本:
"{\"message\":\"demo\",\"path\":\"C:\\\\demo\"}"
把这份完整文本重新粘贴到编辑器,点击“校验 / 格式化”。本次校验成功,但它仍然保持带引号的一行,并没有自动展开成 message 与 path 两个字段。

这是因为最外层的值是字符串,字符串里面才保存了一段对象文本。JSON 的合法顶层值不只包括对象和数组,字符串也可以通过语法检查。绿色提示不能告诉你它已是应用想要的对象类型。
在程序中,如果已经确认响应文本就是这种完整外层字符串,可以先解析外层,再解析里面的对象文本。以下代码中的 responseText 指上面的完整输入:
const innerText = JSON.parse(responseText);
const payload = JSON.parse(innerText);
是否需要第二次解析,应由实际类型和接口约定决定。不要对已经是对象的数据机械地再解析一次,也不要把程序调试器为了展示字符串而添加的转义形式,未经核对就当成网络原始响应。
去转义只撤回对应层,路径转义仍要保留
回到第二步保存的、没有外层双引号的转义片段。重新粘贴,点击一次“去转义”,再点击“校验 / 格式化”。本次恢复为对象,两个字段都能正常展开,路径仍显示为 C:\\demo。

路径里的两个反斜杠是这一层 JSON 所需的表示,不能为了“看着干净”继续消掉。当前已经恢复到最初对象文本所表达的内容,就应该停下。
本次还对完整外层字符串直接点击过“去转义”:内部引号发生变化,但最外层引号仍保留。这说明该按钮不能等同于 JSON.parse,不会替你完成任意层数的类型转换。需要处理完整的外层字符串时,优先按接口约定在程序中解析;需要撤销工具产生的转义片段时,回到对应片段逐步操作。
排查时先确定拿到的是原始对象文本、转义片段,还是完整外层字符串,再选择格式化、去转义或程序解析。每完成一层都检查类型和字段值,避免把路径本身需要的反斜杠一并删掉。