免费在线 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 的大整数应作为字符串发送,以防精度丢失。