JSON 格式化工具 - JSON 语法详解与在线格式化指南

什么是 JSON?

JSON 全称为 JavaScript Object Notation,是一种基于文本的轻量级数据交换格式。它的设计目标是让人类能够方便地阅读和编写,同时也能被机器高效地解析和生成。JSON 脱胎于 JavaScript 语言的对象字面量语法,但如今已经成为一种独立于语言的通用数据格式标准(RFC 8259)。

在日常开发中,我们几乎每天都会接触到 JSON。无论前端接收后端接口返回的数据,还是后端读取配置文件,JSON 都是最常见的数据载体。它以简洁的键值对结构组织数据,能够表达复杂的嵌套关系,同时又不像 XML 那样冗长繁琐。

在线 JSON 格式化工具

将你需要处理的数据粘贴到下方输入框,点击对应按钮即可完成格式化或压缩。所有处理均在浏览器本地完成,数据不会上传至任何服务器。

结果将显示在这里...

JSON 的数据类型详解

JSON 规范定义了六种基本数据类型,每一种都有明确的语法要求和适用场景。理解这些类型是正确使用 JSON 的基础,下面逐一介绍。

对象(Object)

对象是 JSON 中最核心的结构,由花括号 {"key": "value"} 包裹,内部是以逗号分隔的键值对集合。键名必须是双引号字符串,值可以是任意 JSON 数据类型。对象常用于表示一个实体的多个属性,例如一条用户记录或一个商品信息。

数组(Array)

数组由方括号 [value1, value2] 包裹,内部是逗号分隔的有序值列表。数组中的元素可以是任意类型,也可以混合不同类型。在实际数据中,数组通常用于表示同类项目的集合,比如一个用户列表或多条日志记录。

字符串(String)

字符串必须用双引号包围,内部可以包含 Unicode 字符。如果需要表示特殊字符(如换行符、引号本身),则需要使用反斜杠进行转义。单引号在 JSON 中不是合法的字符串定界符,这是很多开发者容易混淆的地方。

数字(Number)

JSON 的数字类型不区分整数和浮点数,统一用一种格式表示。支持正负号、小数点和科学计数法(如 2.5e3)。但需要注意,JSON 不支持八进制、十六进制字面量,也不支持 NaNInfinity

布尔值(Boolean)

布尔值只有两个取值:truefalse,全部小写,不能加引号。布尔值常用于表示开关状态、是否激活等二元条件。需要注意不要把 true 写成 True"true",前者不符合规范,后者则变成了字符串。

null

null 表示空值或缺失值,全部小写且不加引号。它和空字符串 ""、数字 0、布尔值 false 的含义完全不同。null 明确表示"这个字段没有值",在 API 响应中常用来标识某个可选字段未被赋值。

JSON 语法规则

JSON 的语法规则相对简单,但非常严格。正是这种严格性保证了 JSON 可以被任何编程语言可靠地解析。以下是几条必须遵守的核心规则。

键名必须使用双引号。这是一个最常见的错误来源。在 JavaScript 对象字面量中,键名可以不加引号或使用单引号,但在 JSON 中,所有键名必须用双引号包裹。例如 {"name": "Tom"} 是合法的,而 {name: "Tom"}{'name': "Tom"} 都不是合法的 JSON。

不支持注释。JSON 规范不允许在数据中插入注释。虽然很多解析器(如 JavaScript 的 JSON.parse)会忽略行注释 // 和块注释 /* */,但这属于扩展行为,并非标准。如果需要在配置文件中添加说明,建议使用 JSONC 等支持注释的扩展格式。

不能有尾逗号。在对象的最后一个键值对之后或数组的最后一个元素之后,不能添加多余的逗号。JavaScript 语法允许尾逗号,但 JSON 严格禁止。例如 [1, 2, 3,] 中的最后一个逗号会导致解析失败。

字符串必须转义特殊字符。字符串内如果出现双引号、反斜杠、换行符等控制字符,必须使用反斜杠进行转义。未转义的控制字符是导致 JSON 解析失败的高频原因之一。

顶层值可以是任意类型。JSON 文本的顶层不仅可以是对象或数组,也可以是字符串、数字、布尔值甚至 null。不过在实际应用中,顶层几乎总是使用对象或数组,以便承载更丰富的数据结构。

常见 JSON 错误及解决方法

在实际开发中,JSON 解析错误是非常高频的问题。以下是五个最常见的错误类型及其排查思路,掌握这些可以帮你节省大量调试时间。

1. 尾逗号错误

在对象的最后一个属性或数组的最后一个元素后面多写了一个逗号。这是从 JavaScript 习惯迁移到 JSON 时最容易犯的错误。解决方法是删除最后一个逗号,或者将数据粘贴到上方的格式化工具中,工具会提示具体的错误位置。

2. 单引号代替双引号

{"name": "Tom"} 写成了 {'name': 'Tom'}。JSON 标准只接受双引号作为字符串和键名的定界符。如果你习惯在 Python 或 JavaScript 中使用单引号,在编写 JSON 时需要特别注意切换为双引号。

3. 未转义的特殊字符

在字符串中直接使用了未转义的换行符、制表符或双引号。比如地址字段中包含换行,会导致 JSON 从中间断裂。解决方法是对这些字符进行转义:换行用 \n,制表符用 \t,双引号用 \"

4. 在 JSON 中添加注释

不少开发者会在 JSON 配置文件中写入 ///* */ 注释来说明字段含义,但标准 JSON 解析器会因此报错。如果确实需要注释,可以考虑使用 JSON5 或 JSONC 格式,或者在数据结构中增加一个专门的 "_comment" 字段。

5. 使用 undefined 值

JavaScript 中的 undefined 不是合法的 JSON 值。当使用 JSON.stringify 序列化对象时,值为 undefined 的属性会被自动忽略。如果需要在 JSON 中表达"无值"的语义,应当使用 null

JSON 在实际开发中的应用场景

JSON 已经成为现代软件开发中不可或缺的数据格式,几乎渗透到了每一个技术领域。了解它的典型应用场景,有助于更好地理解为什么掌握 JSON 格式化如此重要。

API 数据交换

RESTful API 和 GraphQL 接口普遍采用 JSON 作为请求和响应的数据格式。前端通过 fetchaxios 发送 JSON 请求体,后端返回 JSON 响应。格式化后的 JSON 响应方便前端开发者快速理解数据结构并提取所需字段。

配置文件

package.json 到 TypeScript 的 tsconfig.json,从 ESLint 配置到 VS Code 的 settings.json,JSON 被广泛用作项目配置文件的格式。这类文件通常由开发者手动编辑,格式化工具可以确保配置文件始终整洁规范。

日志格式

结构化日志(Structured Logging)越来越流行,很多日志框架支持将日志输出为 JSON 格式。每条日志记录都是一个 JSON 对象,包含时间戳、级别、消息和自定义字段。这种格式便于日志收集系统(如 ELK)进行索引和检索。

NoSQL 数据存储

MongoDB、CouchDB 等 NoSQL 数据库原生使用类 JSON 的文档模型存储数据。Redis 也支持将 JSON 作为值类型进行存取。在这些场景中,JSON 既是数据的存储格式,也是查询和操作的基本单位。

JSON 与其他数据格式的对比

除了 JSON 之外,开发中还会接触到 XML、YAML、CSV 等数据格式。每种格式都有其适用场景和局限性。下表从多个维度对它们进行了对比。

特性 JSON XML YAML CSV
可读性 良好 一般,标签较冗长 优秀,缩进结构清晰 良好,适合表格数据
解析速度 较慢 较慢
数据体积 较小 较大,标签重复多 较小 最小
嵌套能力 支持对象和数组嵌套 支持深层嵌套 支持深层嵌套 不支持嵌套
注释支持 不支持 支持 支持 不支持
浏览器原生支持 原生支持 需要额外解析器 需要额外解析器 需要额外解析器
适用场景 API、配置、通用数据 文档标记、SOAP 配置文件、DevOps 表格数据、数据导入导出

从对比可以看出,JSON 在解析速度、浏览器支持和通用性方面具有明显优势,这也是它成为 Web 开发首选数据格式的主要原因。当然,在配置文件场景下 YAML 的可读性更好,在纯表格数据场景下 CSV 更简洁,选择格式时应根据具体需求决定。

工具使用方法

  • 将 JSON 数据粘贴到上方输入框中
  • 点击"格式化(美化)"按钮,将压缩的 JSON 转为带缩进的可读格式
  • 点击"压缩"按钮,去除所有多余空白字符,减小数据体积
  • 如果 JSON 存在语法错误,工具会显示具体的错误信息和位置
  • 点击"复制结果"即可一键复制处理后的内容

所有数据处理均在您的浏览器本地完成,不会上传到任何服务器,请放心使用。希望这篇教程和工具能帮助你更好地理解和使用 JSON 格式。