JSON 字符串的转义义务
JSON 字符串必须用双引号包裹,只有三类字符被强制转义:双引号、反斜杠,以及 U+0000 到 U+001F 的控制字符。其余字符可以直接出现,中文与 emoji 原样写在字符串里也合法,只要整个文本按 UTF-8 编码。合法转义形式是固定的几个,任何写法上的方言都会让解析器直接抛语法错误。
合法转义一览
| 必须转义 | 双引号、反斜杠、U+0000 到 U+001F 的控制字符 |
|---|---|
| 可选转义 | 斜杠允许写成 \/,语义相同,嵌套在 HTML 脚本里时常用 |
| 简写转义 | \b \f \n \r \t 对应退格、换页、换行、回车、制表 |
| Unicode 转义 | \uXXXX 恰好 4 位十六进制,非 BMP 字符需写成代理对 |
| 明确非法 | \x41、\'、\0、\u{1F600}、字面换行、注释、尾逗号 |
典型使用场景
- 手工拼接请求体:确认引号与反斜杠是否转义
- 把正则或 Windows 路径写进配置:反斜杠必须成对
- 日志字段拼接:换行写成 \n,否则解析即失败
- 排查 .json 配置报错:多半是多出的逗号或不认识的转义
- 跨语言交互:用各语言标准库的编码器生成,别用模板拼接
正确与错误写法
正确与错误写法
{
"path": "C:\\logs\\app.log", // 反斜杠成对,解析后是 C:\logs\app.log
"re": "^\\d{3}-\\d{4}$", // 正则的 \d 在 JSON 里要写成 \\d
"msg": "line1\nline2", // 换行用 \n,不能真的换行
"emoji": "\uD83D\uDE00", // 非 BMP 用代理对
"url": "https:\/\/example.com/a" // \/ 合法但非必需
}常见报错与病因
| 报错关键词 | 病因 | 修法 |
|---|---|---|
| Bad control character in string literal | 字符串里插了真实换行或制表符 | 改成 \n、\t |
| Bad escaped character | 用了 \x 或 \' 之类方言 | 改成 \uXXXX 或去掉反斜杠 |
| Unexpected token ' | 用了单引号或未加引号的键 | 统一改双引号 |
| Unexpected end of JSON input | 转义吃掉闭合引号或内容被截断 | 检查转义引号是否配对 |
| Unexpected non-whitespace after JSON | 存在尾逗号或注释 | 删除注释与尾逗号 |
RFC 8259 要求用于交换的 JSON 文本为 UTF-8。落盘时选无 BOM 的 UTF-8,写成 UTF-16 或带 BOM 的文件在部分解析器上会直接报错。
不要手写编码器。JSON.stringify、Python 的 json.dumps、Java 的 Jackson、Go 的 encoding/json 都会正确处理引号、控制字符与代理对;模板拼接最容易漏掉反斜杠与换行。