JSON 快速入门
JSON 是 Web 开发中数据交换的事实标准。本文从基本格式讲起,涵盖常用操作、常见陷阱和工具推荐。
发布于 2026年4月22日·3040 字·预计阅读 13 分钟
什么是 JSON
JSON(JavaScript Object Notation)是一种轻量级数据交换格式。它基于 JavaScript 的对象字面量语法,但独立于任何编程语言——几乎所有现代语言都支持 JSON 的解析和生成。
典型使用场景:
- API 请求和响应的数据格式(REST、GraphQL)
- 配置文件(
package.json、tsconfig.json) - 日志和存储格式
基本结构
JSON 只有两类复合结构:
对象(Object)——无序的键值对集合,用 {} 包裹:
json
{
"name": "Arch Linux",
"version": "2024.01"
}
数组(Array)——有序的值列表,用 [] 包裹:
json
["vim", "git", "docker"]
两者可以任意嵌套:
json
{
"name": "my-project",
"version": "1.0.0",
"dependencies": {
"react": "^18.2.0",
"next": "^14.0.0"
},
"scripts": {
"dev": "next dev",
"build": "next build",
"lint": "eslint ."
},
"keywords": ["react", "nextjs", "typescript"]
}
数据类型
JSON 支持以下值类型:
| 类型 | 示例 | 说明 |
|---|---|---|
| 字符串 | "hello" | 必须用双引号,不支持单引号 |
| 数字 | 42、3.14、-1 | 整数和小数,不支持前导零 |
| 布尔 | true、false | 全小写 |
| 空值 | null | 表示空 |
| 对象 | {} | 键值对集合 |
| 数组 | [] | 有序列表 |
规则和限制
JSON 的规则很严格,以下是新手最容易踩的坑:
1. 键名必须用双引号
json
// 正确
{ "name": "Alice" }
// 错误 - 单引号
{ 'name': 'Alice' }
// 错误 - 无引号
{ name: "Alice" }
2. 字符串值必须用双引号
json
// 正确
{ "status": "active" }
// 错误
{ "status": 'active' }
3. 不支持注释
json
// 错误 - JSON 不支持注释
{
"port": 3000 // 服务端口
}
// 如果需要注释,考虑使用 JSONC 格式(VS Code 的 tsconfig.json 等支持)
// 或者把说明放在键名里
{
"// port": "服务端口",
"port": 3000
}
4. 不支持尾逗号
json
// 错误 - 最后一个元素后不能有逗号
{
"a": 1,
"b": 2,
}
5. 不支持 undefined、NaN、Infinity
json
// 错误
{ "value": undefined }
{ "value": NaN }
常见操作(JavaScript)
解析 JSON 字符串:
javascript
const text = '{"name": "Alice", "age": 30}';
const data = JSON.parse(text);
console.log(data.name); // Alice
生成 JSON 字符串:
javascript
const data = { name: "Alice", age: 30 };
const text = JSON.stringify(data, null, 2);
JSON.stringify 第二个参数是 replacer,第三个是缩进空格数。
读取嵌套值(可选链):
javascript
const config = JSON.parse(raw);
const port = config?.server?.port ?? 3000;
常见操作(Python)
python
import json
# 解析
with open("config.json", "r", encoding="utf-8") as f:
data = json.load(f)
# 生成
with open("output.json", "w", encoding="utf-8") as f:
json.dump(data, f, indent=2, ensure_ascii=False)
ensure_ascii=False很重要——它允许中文等非 ASCII 字符直接输出,而不是转义成\uXXXX。
JSON vs 其他格式
| 特性 | JSON | YAML | XML | TOML |
|---|---|---|---|---|
| 可读性 | 良好 | 优秀 | 较差 | 良好 |
| 注释 | 不支持 | 支持 | 支持 | 支持 |
| 数据类型 | 有限 | 丰富 | 一般 | 丰富 |
| 适用场景 | API、配置 | CI/CD、K8s | SOAP、遗留系统 | Rust/Cargo 配置 |
速查表
text
对象 { "key": "value" }
数组 ["a", "b", "c"]
字符串 "hello"
数字 42、3.14
布尔 true / false
空值 null
嵌套 { "a": { "b": [1, 2] } }
解析(JS) JSON.parse(text)
生成(JS) JSON.stringify(obj)
解析(PY) json.load(f)
生成(PY) json.dump(obj, f)
常见错误:
- 键名/字符串用单引号
- 有注释
- 尾逗号
- undefined / NaN