JSON 格式化程序

使用实时错误反馈来验证、格式化、压缩和排序 JSON。

免费在线 JSON 格式化程序和验证程序

JSON 是 APIs 和配置文件的通用语言,但缩小或格式错误的 JSON 很难阅读和调试。 Dokall 的 JSON 格式化程序会验证您的输入,突出显示语法错误,并使用正确的缩进进行漂亮的打印。

您还可以缩小 JSON 以减少有效负载大小。一切都在客户端运行 - 您的 API 密钥和敏感数据永远不会接触我们的服务器。将此页面添加为书签,以便在开发过程中快速进行 JSON 调试。

什么是 JSON?

JSON(JavaScript Object Notation,JavaScript 对象表示法)是一种用于结构化数据的轻量级文本格式。它源自 JavaScript 对象语法,但与语言无关——几乎所有编程语言都能解析和生成 JSON。它已成为 REST API、配置文件和数据存储的默认数据格式。

JSON 支持六种数据类型:字符串(双引号)、数字、布尔值(true/false)、null、数组(有序列表)和对象(键值映射)。其简洁正是优势——格式本身没有属性、命名空间或内置模式。

JSON 语法规则

JSON 对语法要求严格。键必须是双引号字符串——单引号和无引号的键均无效。字符串必须使用双引号,不能用单引号。数组或对象最后一个元素后不允许有尾随逗号。

数字不能有前导零(数字 0 本身除外),也不能以小数点结尾。布尔值是小写的 true 和 false,不是 True/False 或 TRUE/FALSE。注释不属于 JSON 规范——如果文件含有 // 或 /* 注释,它就不是合法 JSON(不过部分解析器支持 JSONC 或 JSON5 等扩展)。

标记之间的空白会被忽略,因此你可以通过删除所有空格和换行来压缩(minify)JSON,或用缩进美化(pretty-print)以提高可读性。两者表示的是相同数据。

常见 JSON 错误及修复方法

"Unexpected token" 通常表示逗号、引号或括号位置不对。最常见原因是尾随逗号——{"name": "test",} 在最后一个属性后有逗号,这在 JavaScript 中合法但在 JSON 中不合法。

"Unexpected end of input" 表示解析器在所有方括号或花括号闭合之前就到达了字符串末尾。请清点开闭括号。带括号匹配的编辑器对此很有帮助。

"Bad control character" 通常表示字符串包含未转义的换行、制表符或其他控制字符。在 JSON 字符串中,换行必须写成 \n,制表符写成 \t,反斜杠写成 \\。

"Duplicate key" 在技术上被 JSON 规范允许,但大多数解析器会使用最后一个值并静默丢弃前面的值,这可能导致难以排查的 bug。Dokall 的格式化工具会标记重复键,便于你发现它们。

JSON 与 XML、YAML 的对比

JSON 紧凑且易于程序解析。它没有注释、没有属性,类型系统简单。最适合:API、数据交换、不需要注释的配置文件。

XML 较为冗长,但支持属性、命名空间、模式(XSD)和转换(XSLT)。它具有自描述性,可表示混合内容(带内联标记的文本)。最适合:文档型数据、SOAP API、对模式要求严格的企业系统。

YAML 是 JSON 的超集,语法更简洁——用缩进代替花括号,支持注释,并有日期等额外类型。但其显著空白使编辑易出错,且部分解析器存在任意代码执行的安全隐患。最适合:配置文件(Kubernetes、Docker Compose、CI/CD)、人工编辑的数据。

在 API 响应和程序化数据交换方面,JSON 已基本胜出。对需要人工编辑的配置文件,YAML 或 TOML 往往更受青睐。

美化 JSON 与压缩 JSON

美化后的 JSON 使用换行和缩进(通常为 2 或 4 个空格)使结构一目了然。更易于阅读、审查和调试。适合开发阶段、文档,以及存储在需要关注 diff 的版本控制配置文件中。

压缩 JSON 会去掉所有不必要的空白。一个 50 KB 的格式化 JSON 文件压缩后可能缩减到 30 KB。在成千上万次 API 响应中,这能减少带宽、加快解析并降低成本。适合生产环境的 API 响应、数据库中存储的数据以及网络载荷。

Dokall 的格式化工具可一键在两者间切换。数据完全相同——只改变空白。若还需要按键排序以获得确定性输出(便于比较两个 JSON 对象),本工具支持按字母顺序排序键。

在 API 中使用 JSON

在 API 请求中发送 JSON 时,将 Content-Type 标头设为 application/json。接收 JSON 时,解析前请确认响应具有该内容类型。大多数 HTTP 客户端会自动处理,但内容类型不匹配是 "unexpected token" 错误的常见来源。

对于大型 JSON 载荷,可考虑使用流式解析器,增量处理数据而不是全部载入内存。在 Node.js 中,JSONStream 等库可解析 GB 级文件。在 Python 中,ijson 可实现同样目的。

JSON 本身不原生支持日期、二进制数据或 BigInt 值。日期通常序列化为 ISO 8601 字符串(2024-01-15T10:30:00Z)。二进制数据用 Base64 编码。超过 JavaScript Number.MAX_SAFE_INTEGER 的大整数应作为字符串发送,以防精度丢失。

常见问题

JSON 代表什么?
JSON 代表 JavaScript Object Notation(JavaScript 对象表示法)。尽管名称如此,JSON 与语言无关,几乎被所有现代编程语言使用。它由 Douglas Crockford 在 2000 年代初提出,并在 RFC 8259 中正式标准化。
JSON 可以有注释吗?
不可以。JSON 规范不支持注释。若配置文件需要注释,可考虑 JSONC(带注释的 JSON,VS Code 使用)、JSON5、YAML 或 TOML。若收到带注释的 JSON,Dokall 的 JSON 修复工具可去除注释并输出合法 JSON。
JSON 文件的最大大小是多少?
JSON 规范没有定义大小上限。实际限制取决于解析器和可用内存。大多数语言在内存中解析 JSON,因此 1 GB 的文件至少需要 1 GB 内存。对于非常大的数据集,请使用流式解析器(Node.js 的 JSONStream、Python 的 ijson),或专为大数据设计的格式,如 NDJSON(换行分隔的 JSON)。
JSON 与 JavaScript 对象有什么区别?
JavaScript 对象是运行时数据结构,可包含函数、undefined、symbol,并可使用单引号或无引号的键。JSON 是文本格式——键必须用双引号,值不能是函数或 undefined,也不允许尾随逗号。JSON.parse() 将 JSON 字符串转为 JavaScript 对象;JSON.stringify() 则做相反操作。
如何验证 JSON?
将 JSON 粘贴到 Dokall 的格式化工具中——它会自动验证并用行号高亮语法错误。在程序中,可使用 JavaScript 的 JSON.parse()(无效输入会抛出错误)、Python 的 json.loads(),或在终端运行 jq . yourfile.json。若需模式验证(检查数据是否符合预期结构),请使用 JSON Schema。
什么是 JSON Schema?
JSON Schema 是用于描述 JSON 数据结构与验证规则的规范。它定义预期类型、必填字段、值约束以及嵌套对象形态。用于 API 请求/响应验证、表单生成和文档。常用验证器包括 Ajv(JavaScript)、jsonschema(Python)和 json-schema-validator(Java)。
如何在终端中美化 JSON?
使用 jq:echo '{"a":1}' | jq . 会输出带语法高亮的格式化结果。Python:python -m json.tool file.json。Node.js:node -e "console.log(JSON.stringify(JSON.parse(require('fs').readFileSync(0,'utf8')),null,2))" < file.json。在 macOS 上可通过 Homebrew 安装 jq:brew install jq。
为什么我的 JSON 无效?
最常见原因是尾随逗号、单引号字符串、无引号的键、注释,以及未转义的特殊字符(换行、制表符、反斜杠)。可使用 Dokall 的 JSON 修复工具自动修复这些问题,或粘贴到格式化工具中查看确切的错误位置。