开发者工具 · JSON 格式化程序和验证程序
JSON 字符串转义解释:\n、\uXXXX 和控制字符
· 工作原理
json 开发人员工作流程 验证
JSON 字符串中的原始换行符无效,制表符也是如此。这篇文章介绍了八个转义序列、\u 转义和代理对如何工作,以及为什么粘贴的段落会使整个文件无效。
破坏有效负载的段落
破坏有效负载的段落 - 将可见换行符粘贴到引用的描述中会将控制字符直接插入到 JSON 字符串中。第一行看起来很完整,但开头引号仍然需要字符串内容或结尾引号。当解析器到达原始换行符时,它会在那里停止,因为 JSON 字符串不能以这种方式跨越物理行。只要解码值需要换行符,文本就必须包含两个字符转义 `\n`。
从文档或电子表格复制的制表符会导致相同类型的故障,即使编辑器可能会将它们呈现为无害的间距。将文本制表符替换为 `\t`,将回车符替换为 `\r`,并将其他禁止的控件替换为其命名或 Unicode 转义符。
JSON 允许的八种转义
JSON 允许八个转义 - 在反斜杠之后,缩写形式为 `"`、`\\`、`\/`、`\b`、`\f`、`\n`、`\r` 和 `\t`。它们代表引号、反斜杠、斜杠、退格、换页、换行、回车和水平制表符。斜杠也可能显示为未转义; `\/` 的存在主要是为了与曾经专门处理关闭脚本序列的上下文兼容。
JSON 反斜杠后面不能有其他字母。编程语言中常见的序列(例如 `\v`、`\0`、`\x41` 或反斜杠后跟物理换行符)在这里无效。当不存在短转义时,请使用 `\u` 后跟四个十六进制数字。这个小的固定词汇表使 JSON 字符串保持可移植性:消费者不需要 JavaScript、Python 或特定于 shell 的转义规则来确定有效文本表示的字符。
为什么文字制表符无效但文字 é 可以
为什么文字制表符无效,但文字 é 可以 - JSON 禁止字符串内从 U+0000 到 U+001F 的未转义代码点。该范围包含选项卡、换行符和其他控件,其不可见效果可能会破坏框架或显示。字母 `é` 是 U+00E9,远远超出了控制范围,因此 UTF-8 JSON 可以将其直接包含在引号之间。对于大多数脚本、符号和表情符号来说也是如此。
因此,转义普通 Unicode 是可选的,而不是清洁要求。 `"café"` 和 `"caf\u00e9"` 解码为相同的字符序列。直接文本通常更容易让人阅读,而转义可以帮助仅 ASCII 传输或使特定代码单元可见。控制字符不同:它们的转义是强制性的。
\uXXXX 如何转义工作
`\uXXXX` 转义如何工作 - `u` 后面必须紧跟四个十六进制数字,在任何情况下都使用 0–9 或 A–F。 `\u00E9` 表示 `é` 的 UTF-16 代码单元,`\u000A` 表示换行。较少的数字、大括号(例如 `\u{1F600}`)或非十六进制字母会使 JSON 无效,即使另一种编程语言接受该表示法。
U+FFFF 以上的字符在此转义形式中表示为代理对。表情符号 😀 可以写为 `\uD83D\uDE00`:高代理和低代理在解析为一个 Unicode 标量值后组合在一起。 JSON 语法可以携带不成对的代理转义,但下游编码器和应用程序可能会拒绝或替换它,因为它不能识别完整的 Unicode 字符。
工作示例:转义 Windows 路径和 HTML 片段
工作示例:转义 Windows 路径和 HTML 片段 - 预期路径 `C:\Temp\report.txt` 需要在 JSON 源中将每个反斜杠加倍:`"C:\\Temp\\report.txt"`。如果不加倍, `\T` 是无效的转义,并且诸如 `\r` 或 `\t` 之类的序列可以默默地成为控制字符而不是路径分隔符。根据预期值构建 JSON,而不是通过猜测哪些显示的斜杠已经属于外部语言。
HTML 片段(例如 `<a title="Report">Open</a>`)可以按字面意思保留其尖括号和斜杠,但属性引号必须在 JSON 字符串内变为 `\"`。如果换行符分隔两个标签,请将其编码为 `\n`。可以验证生成的 JSON 成员并将其解析回原始 HTML 文本。
逃脱加倍的地方
转义符加倍的地方 - 每个封闭的文本语法都有自己的机会解释反斜杠。包含解码字符串 `line1\nline2` 的 JSON 文档必须转义该反斜杠,生成 `"line1\\nline2"`。如果 JSON 文本本身存储为 JSON 字符串,则其引号和两个反斜杠需要另一层转义。明显的混乱记录了多种表示形式,而不是 JSON 的特殊扩展形式。
Shell 和编程语言文字在 JSON 解析器看到参数之前添加自己的引用规则。从内到外诊断:首先写入准确的解码值,将其编码为 JSON 一次,然后为周围的 shell 或源语言编码完整的 JSON 文本。在每个边界,检查下一个解析器实际接收到的字节或字符。
这不包括什么
这不包括什么 — HTML 实体(例如 `"`)和 URL 百分比编码(例如 `%20`)是针对单独语法上下文的单独转换。 JSON 解析器不会解码任何一种形式。字符串 `"""` 解析后包含六个文字字符,而不是引号,而 `"%20"` 包含一个百分号后跟两位数字,而不是空格。仅当数据跨入 HTML 或 URL 组件时才应用这些编码。
此讨论也不会取代输出编码。从不受信任的源接收的有效 JSON 仍然可以包含 HTML、类似脚本的文本或终端控制序列作为普通字符串数据。稍后呈现或执行命令的应用程序必须安全地处理该目的地。 JSON 转义保护 JSON 结构;这不是普遍的消毒。
要点:逃避语法所禁止的内容,仅此而已
要点:转义语法所禁止的内容,仅此而已 - 双引号、反斜杠和 U+0020 下面的代码点需要在 JSON 字符串内注意。普通 Unicode 可以保持可读性,而 `\uXXXX` 提供精确的四位数字替代,代理对代表 U+FFFF 以上的字符。对明显空白位置的诊断通常会标识文字换行符、制表符或其他必须用其文本转义符替换的控制字符。
计算编码层数,而不是通过视觉计算斜线。从应用程序应接收的值开始,对 JSON 进行一次编码,然后才为任何外壳、源文件或第二个 JSON 字符串引用生成的文档。验证呈现给 JSON 解析器的文本,并在正确性很重要时检查解码后的字符串。