JSON 转义/去转义
JSON 转义/去转义是免费在线工具:把任意文本一键转成能直接嵌进代码、配置或接口参数的 JSON 字符串,引号、反斜杠、换行都会被正确转义;也能把日志里带反斜杠的 JSON 转义串还原成原样 JSON。被转义好几层的可一键解到底,非法转义会指明第几行第几列与原因,原样保留、不吞字。浏览器本地计算、文本不上传。
在上方粘贴文本,或点「填入示例」。
如何使用JSON 转义/去转义
JSON 转义/去转义怎么用:把文本粘进输入框,或直接拖入 .json / .txt / .log 文件;不确定从哪开始就点「示例」看效果。文本只在你的浏览器里处理,不上传。
选方向与选项:默认是「去转义」并只解一层;日志里被转了好几层的选「解到底」,结果是 JSON 时可勾「自动美化」。要把原文变成 JSON 字符串就切到「转义」,按需勾外层双引号、中文转 \uXXXX、斜杠转 \/ 或嵌入 script 安全。
拿结果:一键复制或下载;统计条会告诉你解了几层、有几处问题。问题列表里的每一条都写明第几行第几列与原因,点「定位」直接选中原文里出错的那一段。
关于JSON 转义/去转义的常见问题
- 在线 JSON 去转义会上传粘贴的内容吗?
- 不会。JSON 转义与去转义全部在你的浏览器里用 JavaScript 完成,粘贴的文本、拖入的文件和转换结果都不会发送到任何服务器。本页只把方向、层数、宽松模式这几项参数偏好记在本机 localStorage,原文与结果一个字都不落盘。想自证可以打开 F12 的网络面板再转一次,转换过程没有任何请求;页面本身会加载一个访问统计脚本,它不读取也不上报你粘贴的内容。
- JSON 字符串里的反斜杠是什么意思?怎么去掉?
- 反斜杠是 JSON 的转义符:字符串里不能直接出现双引号、反斜杠和换行,于是写成 \" \\ \n 这样的两字符序列。它们是在序列化时加上去的,并不是数据本身。要去掉,把文本粘进本页选「去转义」即可,工具会按 JSON 规范逐个还原,而不是简单地把反斜杠删光——那样会把 \\ 和 \n 一起弄坏。
- 日志里转义过的 JSON 字符串怎么还原成对象?
- 这是最常见的用法:日志框架或消息队列把整段 JSON 当成普通字符串又序列化了一次,于是满屏都是 \"。把那段文本整段粘进来,保持「去转义」,勾上「结果是 JSON 时自动美化」,就能直接得到缩进好的 JSON 对象,雪花 ID 这类大数字也按原文保留。之后要校验、压缩或排序 key,可以接着用 JSON 格式化。
- 被转义好几层的 JSON 怎么一次去转义?
- 选「解到底」。工具会一层层自动去转义,统计条告诉你一共解了几层,最多 8 层,超过会停下并提醒你检查输入。它在某一层结果里出现未转义的双引号时就会停:那说明已经得到真正的 JSON 了,再解就会把字符串内部的 \n 变成真换行,反而把 JSON 弄坏。
- JSON 转义工具和 JSON 格式化有什么区别?
- 默认参数下两边的结果逐字相同,本页的单测就是拿两者互相对照锁住的。区别在于:JSON 格式化页的转义只是附带的两个按钮,只解一层、报错只有引擎原文;本页多了一键解到底、问题按行列定位且坏片段原样保留、宽松模式认 JS 与 Python 的写法,以及中文转 \u、斜杠转 \/、嵌入 script 安全、转义多层这几个开关。要美化或校验整段 JSON 请用 JSON 格式化。
- JSON 转义时中文要不要转成 Unicode 编码?
- 不必。JSON 规范允许字符串里直接出现中文,JavaScript 的 JSON.stringify 和 Go 默认都原样输出。只有对接只认 ASCII 的老系统,或者你想让结果和 Python json.dumps 的默认输出(ensure_ascii=True)一模一样时,才勾「中文等非 ASCII 转 \uXXXX」。要查某个字的码点或在十种写法之间互转,请用 Unicode 转换。
- JSON 去转义报错「非法转义」是什么原因?
- JSON 只认 9 种转义:\" \\ \/ \b \f \n \r \t 和 \uXXXX,其它反斜杠组合都不合法。最常见的两个来源是 JS 或 Python 字符串里的 \x41 和单引号转义,以及没有转义过的 Windows 路径,比如 C:\new。本页遇到非法转义会原样保留这两个字符,在问题列表里写明第几行第几列,其余部分照常还原;如果文本来自 JS 或 Python,打开「宽松模式」即可。
- JS、Python 的单引号转义能用 JSON 去转义吗?
- 可以,打开「宽松模式」。它会额外认出 JS 与 Python 字符串常用的单引号转义、\x41 这类两位十六进制、\v、\0、ES6 的 \u{1F600} 写法和行尾续行,还认单引号包起来的整段字面量,并在问题列表里注明按宽松规则还原了几处。输出仍是普通文本,本页不做 JSON5 或单引号 JSON 的整文档解析。
- JSON 字符串里的换行和 Tab 必须转义吗?
- 必须。JSON 规定字符串里的 U+0000 到 U+001F 控制字符都必须转义,换行要写成 \n,Tab 要写成 \t,否则 JSON.parse 会直接报错。本页转义时会自动处理;去转义时如果正文里本来就有真换行,会原样保留并给一条提示,因为那通常说明这段文本并不是标准的 JSON 字符串。
- JSON 转义后放进 HTML 的 script 里安全吗?
- 默认的转义不处理尖括号,字符串里如果出现 script 结束标签,浏览器会在那里提前结束整个 script 块。勾选「嵌入 script 安全」后,尖括号与 & 会写成 \u003c \u003e \u0026,U+2028 和 U+2029 也会转义,这和 Go 的默认行为一致。它只解决提前闭合与断行这两个问题,不能替代完整的 XSS 防护;要放进 HTML 正文请改用 HTML 实体转换。
- JSON 转义要不要把斜杠 / 也转义?
- 不需要。JSON 规范里 / 写成原样和写成 \/ 都合法,解析结果完全相同。JavaScript、Python、Go 默认都不转;PHP 的 json_encode 默认会转,所以从 PHP 接口拿到的 JSON 里常见 \/。想让输出和 PHP 一致就勾「/ 转成 \/」,去转义时两种写法都能还原。
- emoji 做 JSON 转义后为什么变成两段编码?
- 因为 \uXXXX 写的是 UTF-16 码元,最大只到 U+FFFF,而大部分 emoji 的码点超出这个范围,只能拆成两段代理对来写,比如笑脸会变成高位与低位两段。这是规范行为,去转义时本页会把两段合回一个 emoji。如果只剩半段,本页不会产出乱码或问号,而是原样保留那段转义写法并在问题列表里标出来。
- JSON 去转义和 Unicode 转换有什么区别?
- 处理的层次不同。JSON 去转义处理的是 JSON 字符串语法:引号、反斜杠、换行和 \uXXXX;Unicode 转换处理的是字符与码点写法之间的互转,支持 中、U+4E2D、%u4E2D 等十种记法,但不碰引号和换行。日志里的 JSON 用本页,只想把 \u4e2d 这类码点写法变回中文或查码点用 Unicode 转换。
- 手机上能做 JSON 转义和去转义吗?
- 可以。本页在手机浏览器里同样可用,输入框与结果框会上下排列,按钮都按手指点击的尺寸做了放大。处理全部在本机完成,不需要安装任何应用,也不需要联网之外的权限,复制结果后可以直接粘回聊天或工单。
- JSON 去转义能处理多大的文本和文件?
- 单次最多 500 万字,可以直接拖入 10 MB 以内的 .json、.txt、.log 文件,按 UTF-8 读取,开头的 BOM 会自动去掉并提示。文本在 50 万字以内时边输入边自动出结果;超过 50 万字会暂停自动转换,改为点「开始转换」,避免每敲一个字都把整段文本扫一遍。
JSON 转义字符对照表:哪些字符必须转义
JSON 字符串里有三类字符必须转义:双引号、反斜杠,以及 U+0000 到 U+001F 的控制字符(换行、 回车、Tab 等)。其中 8 个有专门的短写法,其余控制字符一律写成 \u00xx。下表 最后几行是可选的转义:不转也合法,只是某些语言默认会转,或者某些场景下转了更稳妥。json 转义字符、json 换行符转义、json 双引号转义说的都是这张表。
| 字符 | 名称 | JSON 写法 | 常见来源 |
|---|---|---|---|
| " | 双引号 | \" | 字符串里的引号、HTML 属性、嵌套 JSON |
| \ | 反斜杠 | \\ | Windows 路径、正则表达式、已转义过的文本 |
| 换行 LF | U+000A | \n | 多行文本、日志、SQL、Markdown |
| 回车 CR | U+000D | \r | Windows 换行(CRLF)的前半段 |
| 制表符 Tab | U+0009 | \t | 从 Excel / 表格复制的文本 |
| 退格 | U+0008 | \b | 终端输出、控制字符残留 |
| 换页 | U+000C | \f | 老式打印文本、PDF 抽取 |
| 其它控制字符 | U+0000–U+001F | \u0001 等 | 二进制残留;JSON 规定必须转义 |
| / | 斜杠(可选) | \/ | PHP json_encode 默认、老系统风格;不转也合法 |
| 中文 / emoji | 非 ASCII(可选) | \u4e2d | Python ensure_ascii、只认 ASCII 的老系统 |
| < > & | HTML 敏感字符(可选) | \u003c \u003e \u0026 | 嵌入 HTML 的 script 标签,Go 默认 |
| 行分隔符 | U+2028 / U+2029(可选) | \u2028 \u2029 | 老版 JS 引擎不允许它们出现在字符串字面量里 |
本页转义时十六进制一律输出小写,与 JavaScript 的 JSON.stringify、Python 与 Go 保持一致; 去转义时大小写都认,\u4E2D 与 \u4e2d 一样能还原。
为什么日志里的 JSON 会出现一堆反斜杠
原因几乎总是同一个:一段本来好好的 JSON,被当成普通字符串又序列化了一次。日志框架把对象 写成 message 字段、消息队列把报文塞进 payload、数据库用 text 字段存 JSON,都会发生这件事。 每多序列化一次,原来的每个双引号前就多出一批反斜杠。日志里的 json 怎么还原、转义后的 json 怎么还原,答案都是数一数反斜杠,然后去转义对应的层数。
| 层数 | 转义结果 | 每个引号前的反斜杠 |
|---|---|---|
| 1 层 | {\"a\":1} | 1 个 |
| 2 层 | {\\\"a\\\":1} | 3 个 |
| 3 层 | {\\\\\\\"a\\\\\\\":1} | 7 个 |
规律是:k 层转义后,每个引号前有 2 的 k 次方减 1 个反斜杠,也就是 1、3、7 个。看到\\\" 就是两层,选「解到底」一次解完即可。举个真实的例子,下面这行来自 一条登录日志:
{\"user\":\"小鹿\",\"msg\":\"登录成功\\n来自 iOS\",\"id\":12345678901234567890}去转义一层之后就是一段合法的 JSON,其中的大数字原样保留:
{"user":"小鹿","msg":"登录成功\n来自 iOS","id":12345678901234567890}在代码里做同一件事:去转义一层相当于调用一次 JSON.parse(Python 是 json.loads),转了几层就解析几次。 有两个常见的坑:一是从日志里抠出来的转义串通常不带外层双引号,要先在两头补上引号再解析,否则直接报错; 二是 JavaScript 的 JSON.parse 会把超过 2 的 53 次方的整数就近取整,比如 {"id":9007199254740993} 解析后 id 变成 9007199254740992,末位悄悄差了 1。雪花 ID、订单号常在这个量级,本页美化时按原文保留数字, 不经过 JS 的数值类型。
JSON 多层转义去转义什么时候该停
「解到底」不是把反斜杠删光,而是一层层还原,直到得到真正的 JSON 为止。本页的规则是:某一层 结果里一旦出现未转义的双引号,就说明它已经是 JSON 文档本身,立刻停下。 因为 JSON 字符串内部的 \n 是数据的一部分,必须保留。
| 做法 | 结果 | 还是合法 JSON 吗 |
|---|---|---|
| 原始输入 | {\"msg\":\"l1\\nl2\"} | 不是,它是一段转义过的字符串 |
| 本页解到底(停在第 1 层) | {"msg":"l1\nl2"} | 是,msg 的值是两行文本 |
| 把反斜杠全删掉 | {"msg":"l1nl2"} | 是,但换行没了,数据被改了 |
另外两条兜底:最多解 8 层,每一层都必须让文本变短,否则立即停止;某一层出现非法转义也会停在 那一层,不会拿坏数据继续往下猜。只有反斜杠、没有转义引号的普通文本(比如 C:\Users)解一次 就停,不会把 \U 当成转义。
JSON 去掉反斜杠:为什么不建议用替换来去转义
很多人第一反应是在编辑器或代码里用替换:把 \" 换成 "。 这种做法在简单样本上看起来没问题,一碰到真实数据就会出错。json 去除转义符、json 去掉反斜杠、 去掉 json 里的斜杠,正确做法都是按规范逐个解析,读到反斜杠就连同下一个字符一起处理。
| 输入 | 正确结果 | 替换法为什么会错 |
|---|---|---|
a\\"b | a\"b | 先替 \" 会把「字面反斜杠 + 引号」错拆,留下一个多余或缺失的反斜杠 |
l1\nl2 | l1 + 换行 + l2 | 只替引号的话 \n 原样留着,多行文本仍是一行 |
\u4e2d\u6587 | 中文 | \uXXXX 要按十六进制算码元,还要把 emoji 的两段合起来 |
本页的去转义是单遍扫描的状态机,不会出现「先替这个再替那个」的顺序问题。如果你确实需要按 规则批量改文本,请用 查找替换 或先在 正则表达式测试 里验证表达式。
JSON 转义选项怎么选:ensure_ascii 与斜杠
不同语言的 JSON 库默认行为并不一样,同一段文本序列化出来可能长得不同,但它们都是合法 JSON, 解析结果完全相同。下表是四种常见实现的默认行为,以及想在本页得到同样输出该勾哪个开关。
| 实现 | 中文等非 ASCII | 斜杠 / | 尖括号与 & | 本页对应开关 |
|---|---|---|---|---|
| JavaScript JSON.stringify | 不转,原样输出 | 不转 | 不转 | 本页全部开关关闭时与它逐字相同 |
| Python json.dumps | 转成 \uXXXX(ensure_ascii=True),0x7F 也转 | 不转 | 不转 | 勾「中文等非 ASCII 转 \uXXXX」 |
| PHP json_encode | 转成 \uXXXX(加 JSON_UNESCAPED_UNICODE 才不转) | 转成 \/(加 JSON_UNESCAPED_SLASHES 才不转) | 不转(加 JSON_HEX_TAG 等选项才转) | 勾「非 ASCII 转 \uXXXX」与「/ 转成 \/」 |
| Go json.Marshal | 不转,原样 UTF-8 | 不转 | 转成 \u003c \u003e \u0026,U+2028/2029 也转 | 勾「嵌入 script 安全」 |
JSON 转义工具支持哪些功能
- 本地处理不上传:json 转义不上传任何内容,断网也能用,只记参数偏好不记文本。
- 多层一键解到底:json 多层转义、json 双重转义都能一次还原,并告诉你共几层。
- 行列定位、不吞字:非法转义、半个代理、末尾反斜杠原样保留,点「定位」选中原文。
- 严格与宽松两种口径:严格模式只认 JSON 的 9 种转义,宽松模式额外认 JS/Python 写法。
- 与 JSON.stringify 逐字一致:默认转义结果和 json stringify 在线运行的结果完全相同。
- 大数字美化不改写:json 字符串转 json 对象并美化时,超长整数按原文保留。
这件事的叫法很多:json 转义在线、json 在线转义、json 转义工具、json 字符串转义、json 字符串化、文本转 json 字符串说的是转义方向;json 去转义在线、json 反转义、json 转义还原、字符串转 json、json 反斜杠怎么去掉、json 里的 \n 怎么还原说的是去转义方向;json 中文转 unicode 对应「非 ASCII 转 \uXXXX」开关,json 转义斜杠对应「/ 转成 \/」开关。英文里通常叫 json escape、json unescape、json string escape online 或 unescape json string。还原出 JSON 之后,可以接着用 JSONPath 查询 取字段、用 JSON 对比 找差异,或用 JSON 转 TypeScript 生成类型;要查码点请用 Unicode 转换。