来自 API 日志或配置文件的 JSON 通常是一长行,而无法解析的 JSON 通常会在你看不到的地方出错。这个工具会为其添加缩进以便阅读,在需要精简时进行压缩,而当它损坏时会告诉你具体的行号和列号并显示那一行。
大多数时候,你来这里不是为了让 JSON 变得美观 - 而是因为某个地方拒绝了它却没说明原因。解析器会报告行号、列号以及它期望的内容,工具会打印出那一行以及周围两行。配置文件第四百行缺少一个逗号,一旦你知道它在哪里,三十秒就能修好。
JSON 从未允许过这两者,但人们实际交给你的文件 - tsconfig、VS Code 设置、任何手工编辑过的东西 - 里面到处都是。勾选该选项会在解析前将它们去除,工具随后会说明去除了多少注释和多少逗号。这是可选的,并会被精确报告,因为一个默默修改你文档的格式化工具,比一个直接拒绝它的工具更糟糕。
它不会猜测你的意图。除了上面两种删除之外,不会修复任何东西:未闭合的大括号、单引号的键或没有引号的键只会被报告,而不会被重写。排序键和重新缩进从不改变数组的顺序,也从不改动字符串。下一节列出了输出仍可能与你粘贴的内容不同的少数情况。
你的 JSON 会被解析后重新写出,所以有些内容会以规范化的形式返回。数字会被重新书写:1.50 变成 1.5,1E3 变成 1000.0,-0 变成 0,位数超过 64 位浮点数所能容纳的小数会被舍入(0.1000000000000000055 变成 0.1)。整数在 4,300 位以内保持精确(更长的会被拒绝)。如果一个对象重复了某个键,只保留最后一个值,且没有任何警告。NaN、Infinity 和 -Infinity 会被接受并原样输出,尽管标准 JSON(RFC 8259)不允许它们;超出浮点数范围的数字,例如 1e400,会输出为 Infinity。如果这些对你要导入数据的系统很重要,请在相信"没有错误"的结果之前自行检查。
它会被发送到服务器进行解析,并在同一响应中直接返回。不会写入磁盘、不会被缓存、不会被记录日志,使用记录只保留计数 - 大小、嵌套深度、所选模式 - 绝不会保留文档本身。
通常是因为注释、末尾逗号、单引号或未加引号的键 - 这些在配置文件中很常见,但都不是合法的 JSON。前两种情况请勾选"允许注释和末尾逗号";其余的确实无效,必须修复。
每次请求最多 2,000,000 个字符;更长的文本会被拒绝,并给出其确切长度。对于这种大小的文件,jq 这样的命令行工具是更好的选择。
日志管道和流式加载器会逐行读取一个 JSON 对象,而不是读取一个大数组。选择它,顶层数组就会以每行一条紧凑记录的形式返回。
不会。对象的键顺序在 JSON 中没有意义,而有意义的数组顺序则永远不会被触碰。排序的存在是为了让同一文档的两个版本可以在没有噪音干扰的情况下进行比较。
在 Microsoft 365 版 Excel 中,把它保存为 .json 文件,然后选择 Data > Get Data > From File > From JSON(数据 > 获取数据 > 来自文件 > 从 JSON)。Power Query 会打开它:顶层数组显示为 List,To Table(到表)把它变成一列 Records,列标题上的展开按钮(两个箭头)会把每个键拆成单独的列;展开嵌套数组会为每个元素增加一行。Power Query 需要一个有效的 JSON 文档,所以请先在这里修正错误,这里会给出行号和列号,然后保存美化或压缩的输出;JSON Lines 输出是给日志工具用的。本工具本身不会把 JSON 转成 CSV 或 Excel。
Python 自带校验工具:python -m json.tool data.json 会以 4 个空格缩进输出文档,或者以 Expecting ',' delimiter: line 3 column 3 这样的消息停止。如果装了 jq,jq . data.json 会格式化输出,jq empty data.json 只做校验,文件有效时不输出任何内容。两者都不接受注释和尾随逗号,所以带有这些内容的配置文件会在那里报错;把它粘贴到这里并勾选「允许注释和尾随逗号」,就能看到删掉了什么。
解析器在这里需要一个对象的键,却遇到了别的内容。最常见的原因是键用了单引号或没有引号,例如从 Python 或 JavaScript 复制来的 {'name': 'Asha'},会在第 1 行第 2 列停止:JSON 要求每个键和字符串都用双引号括起来,而本工具从不改写引号,所以需要自己修改。如果同样的消息出现在右花括号处,例如 {"a": 1,},说明有尾随逗号;勾选「允许注释和尾随逗号」即可去掉。在 True、False 或 None 处出现 Expecting value,说明这是 Python 的值:JSON 中写作小写的 true、false 和 null。在 Python 中,json.dumps(data) 输出合法的 JSON,print(data) 则不是。错误信息按 Python 解析器的原文以英文显示,方便直接搜索这条消息。
解析器已经读完一个完整的 JSON 值,之后又遇到了更多文本。常见原因:每行一个对象的 JSON Lines(NDJSON)日志,会在第 2 行第 1 列停止;前后粘贴了两个文档;或者最后一个右花括号后面有 // 注释,勾选「允许注释和尾随逗号」可以去掉。本工具一次只检查一个文档,所以请只粘贴一条记录,或者把各条记录用逗号隔开放进 [ ] 中;之后选择 JSON Lines,就会重新按每行一条输出。