JSON 入门:一种轻量级的数据交换格式
JSON(JavaScript Object Notation,JavaScript 对象表示法)是当今软件开发中最常见的数据交换格式之一。无论是调用 Web API、编写配置文件,还是在前后端之间传递数据,JSON 几乎无处不在。它并不是一种编程语言,也不是数据库,而是一种用于表示和交换结构化数据的文本格式。
一、JSON 的由来
JSON 由 Douglas Crockford 在 2001 年左右提出。它最初受到 JavaScript 对象字面量语法的启发,但很快被设计成一种与语言无关的通用格式。2006 年,JSON 被发布为 RFC 4627;2013 年,ECMA 发布 ECMA-404 标准;2017 年,IETF 发布 RFC 8259,进一步明确了 JSON 的规范。今天,JSON 已经成为 REST API、微服务通信、配置管理和日志记录中的事实标准。
二、JSON 的基本语法
JSON 的语法非常简洁,核心结构只有两种:
- 对象:用花括号
{}表示,包含一组键值对。 - 数组:用方括号
[]表示,包含一组有序的值。
对象中的键必须是双引号包裹的字符串,值可以是以下类型:
- 字符串:
"hello" - 数字:
123、3.14、10 - 布尔值:
true、false - null:
null - 对象:
{ "name": "Alice" } - 数组:
[1, 2, 3]
一个典型的 JSON 示例如下:
json
{
"name": "张三",
"age": 30,
"isDeveloper": true,
"skills": ["JavaScript", "Python", "Go"],
"address": {
"city": "北京",
"zip": "100000"
},
"nickname": null
}
需要注意的是,JSON 对格式要求比较严格:
- 字符串必须使用双引号,不能使用单引号。
- 对象的键也必须使用双引号。
- 最后一个元素后面不能有逗号。
- 不支持注释。
- 不支持
undefined、函数、日期对象、NaN或Infinity。
这些限制让 JSON 更容易被不同语言的解析器统一处理。
三、JSON 的解析与生成
几乎所有主流编程语言都内置或提供了 JSON 支持。以 JavaScript 为例:
javascript
const text = '{"name":"Alice","age":25}';
const obj = JSON.parse(text);
console.log(obj.name); // Alice
const output = JSON.stringify(obj, null, 2);
console.log(output);
Python 中可以使用 json 模块:
python
import json
data = json.loads('{"name": "Alice", "age": 25}')
print(data["name"])
text = json.dumps(data, ensure_ascii=False, indent=2)
print(text)
Java、Go、C#、PHP、Rust 等语言也都有成熟的 JSON 库。解析器通常负责把 JSON 文本转换成语言中的对象、字典或结构体;序列化器则把程序中的数据转换成 JSON 文本。
四、JSON 的常见使用场景
JSON 的应用非常广泛,主要包括:
- Web API 数据交换:前后端通过 HTTP 传输 JSON,例如 RESTful API。
- 配置文件:许多工具使用 JSON 作为配置格式,如
package.json、tsconfig.json。 - 日志与数据管道:JSON Lines 格式每行一个 JSON 对象,便于流式处理。
- 移动应用与微服务通信:JSON 体积小、可读性好,适合网络传输。
- 数据存储与缓存:MongoDB、Redis 等系统常以 JSON 或类 JSON 形式存储数据。
五、JSON 的优点
JSON 之所以流行,主要因为:
- 简洁易读:结构清晰,人和机器都容易理解。
- 语言无关:不依赖 JavaScript,几乎所有语言都支持。
- 解析速度快:相比 XML,通常更轻量。
- 表达能力强:支持嵌套对象和数组,能表示复杂结构。
- 生态成熟:有大量解析库、验证工具和 Schema 标准。
六、JSON 的局限
JSON 并非完美,它也有一些限制:
- 不支持注释:配置文件里无法直接写注释。
- 没有日期类型:日期通常被表示为 ISO 8601 字符串。
- 数字精度问题:JSON 数字没有区分整数和浮点数,JavaScript 中超过
2^53 - 1的整数可能丢失精度。 - 不支持二进制数据:二进制通常需要 Base64 编码,体积会增大。
- 没有内置模式:需要借助 JSON Schema 等工具进行验证。
- 重复键行为不统一:规范建议键唯一,但解析器对重复键的处理可能不同。
七、JSON 与其他格式的比较
与 XML 相比,JSON 更简洁,解析通常更简单,但 XML 在命名空间、注释和文档描述方面更成熟。与 YAML 相比,YAML 可读性更强、支持注释,但缩进敏感,解析规则更复杂。与 Protocol Buffers、MessagePack 等二进制格式相比,JSON 体积更大、性能稍弱,但可读性和通用性更好。
八、JSON Schema 与扩展
为了弥补 JSON 缺少模式定义的问题,社区提出了 JSON Schema。它可以用 JSON 本身描述 JSON 数据的结构、类型、必填字段和取值范围,常用于 API 校验和文档生成。
此外,还有一些扩展格式:
- JSON5:允许注释、单引号、尾逗号,适合配置文件。
- JSONC:带注释的 JSON,常见于 VS Code 配置。
- JSON Lines / NDJSON:每行一个 JSON 对象,适合日志和流式数据。
- BSON、MessagePack:二进制表示,提升存储和传输效率。
九、最佳实践与安全注意
使用 JSON 时,建议遵循以下实践:
- 始终使用双引号,保持格式合法。
- 对来自外部的 JSON 进行 Schema 校验。
- 不要使用
eval()解析 JSON,应使用标准解析器。 - 处理大文件时使用流式解析,避免内存暴涨。
- 限制请求体大小和嵌套深度,防止资源耗尽攻击。
- 注意敏感数据不要直接暴露在前端 JSON 中。
- 统一命名风格,如
camelCase或snake_case。 - 日期使用 ISO 8601 字符串,如
"2026-10-04T12:00:00Z"。
十、总结
JSON 是一种简单、通用、易读的数据交换格式。它凭借轻量级结构和广泛的编程语言支持,成为现代软件系统中传递数据的首选格式之一。虽然它没有注释、日期类型和内置模式,但通过 JSON Schema、JSON5、NDJSON 等扩展,可以覆盖更多场景。理解 JSON 的语法、优缺点和最佳实践,是每一位开发者必备的基础技能。
- 点赞
- 收藏
- 关注作者
评论(0)