什么是 JSON?
JSON(JavaScript Object Notation)是一种轻量级数据交换格式,已成为 API、配置文件和数据存储的通用语言。尽管名称中包含 JavaScript,但 JSON 是语言无关的——几乎所有编程语言都能读写它。
JSON 由 Douglas Crockford 在 2000 年代初创建,旨在作为 XML 更简单的替代方案。它的主要优势?人类容易读写,机器容易解析和生成。
JSON 语法基础
有效的 JSON 文档由两种结构构建:
对象 — 用 {} 包裹的无序键值对集合
数组 — 用 [] 包裹的有序值列表
数据类型
JSON 支持恰好六种数据类型:
类型示例String"你好世界"Number42, 3.14, -1, 2.5e10Booleantrue, falseNullnullObject{"键": "值"}Array[1, 2, 3]
重要规则:
键必须是双引号字符串——单引号无效
最后一个元素后不能有尾随逗号
没有注释——JSON 没有注释语法
没有 undefined、NaN 或 Infinity——这些不是有效的 JSON 值
示例文档
{
"name": "FastUtil",
"version": "1.45.0",
"description": "免费在线开发者工具",
"features": ["格式化", "验证", "转换"],
"isOpenSource": true,
"downloads": null,
"author": {
"name": "FastUtil Team",
"url": "https://fastutil.app"
}
}
格式化和美化打印
压缩的 JSON 非常适合网络传输,但对调试来说很糟糕。考虑这个压缩的负载:
{"users":[{"id":1,"name":"Alice","roles":["admin","editor"]},{"id":2,"name":"Bob","roles":["viewer"]}]}
使用 2 空格缩进格式化后,同样的数据立即变得可读:
{
"users": [
{
"id": 1,
"name": "Alice",
"roles": ["admin", "editor"]
},
{
"id": 2,
"name": "Bob",
"roles": ["viewer"]
}
]
}
在 JavaScript 中,可以使用 JSON.stringify 格式化 JSON:
const formatted = JSON.stringify(data, null, 2);
第三个参数控制缩进——2 表示两个空格,4 表示四个空格,或 "\t" 表示制表符。
验证 JSON
无效的 JSON 是 API 错误最常见的原因之一。以下是开发者最常犯的错误:
常见错误
尾随逗号:
{
"name": "Alice",
"age": 30,
}
30 后面的逗号会破坏解析器。删除它。
单引号:
{'name': 'Alice'}
JSON 需要双引号。始终如此。
未加引号的键:
{name: "Alice"}
每个键必须是双引号字符串。
注释:
{
"debug": true // 启用调试
}
JSON 不支持注释。如果需要注释,考虑使用 JSON5 或 JSONC(VS Code 使用的格式)。
编程验证
在 JavaScript 中,将 JSON.parse 包裹在 try-catch 中:
function isValidJSON(str) {
try {
JSON.parse(str);
return true;
} catch (e) {
return false;
}
}
对于模式级验证——确保数据具有正确的结构,而不仅仅是有效的语法——使用 JSON Schema:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"name": { "type": "string" },
"age": { "type": "integer", "minimum": 0 }
},
"required": ["name"]
}
比较和差异对比 JSON
在调试 API 响应或审查配置更改时,经常需要比较两个 JSON 文档。简单的字符串差异比较效果不好,因为格式差异会产生噪音。
语义差异比较比较解析后的数据结构,忽略空白和键顺序。这意味着 {"a":1,"b":2} 和 {"b": 2, "a": 1} 被视为相同。
JSON 差异比较有帮助的关键场景:
API 调试 — 比较预期响应与实际响应
配置管理 — 审查 package.json、tsconfig.json 等的更改
数据迁移 — 验证转换前后的记录
代码审查 — 发现 JSON 测试固件中的有意义更改
格式间转换
JSON 经常需要与其他格式互相转换:
JSON 转 CSV
扁平 JSON 数组自然地转换为 CSV。每个对象成为一行,每个键成为一列:
[
{"name": "Alice", "age": 30, "city": "Berlin"},
{"name": "Bob", "age": 25, "city": "Paris"}
]
变为:
name,age,city
Alice,30,Berlin
Bob,25,Paris
嵌套对象需要扁平化——使用点号表示法如 address.city 或将嵌套值转换为字符串。
JSON 转 YAML
YAML 在配置文件中很流行(Docker、Kubernetes、GitHub Actions)。同样的数据用 YAML 表示:
name: Alice
age: 30
roles:
- admin
- editor
address:
city: Berlin
country: Germany
YAML 对于深层嵌套更具可读性,但引入了空白敏感性,可能导致微妙的错误。
JSON 转 XML
虽然今天不太常见,但某些企业 API 和 SOAP 服务仍然需要 XML:
在 JavaScript 中使用 JSON
解析和序列化
// 将 JSON 字符串解析为对象
const data = JSON.parse('{"name": "Alice"}');
// 将对象转换为 JSON 字符串
const json = JSON.stringify(data);
// 带缩进的美化打印
const pretty = JSON.stringify(data, null, 2);
// 使用替换器过滤字段
const filtered = JSON.stringify(data, ["name", "age"], 2);
替换器函数
JSON.stringify 接受可选的替换器函数用于自定义序列化:
const data = { name: "Alice", password: "secret", age: 30 };
const safe = JSON.stringify(data, (key, value) => {
if (key === "password") return undefined; // 省略敏感字段
return value;
}, 2);
恢复器函数
JSON.parse 接受恢复器函数用于自定义反序列化——对日期很有用:
const json = '{"created": "2026-04-07T10:00:00Z"}';
const data = JSON.parse(json, (key, value) => {
if (key === "created") return new Date(value);
return value;
});
JSON 最佳实践
解析前始终验证 — 永远不要假设传入的 JSON 是有效的。将 JSON.parse 包裹在 try-catch 中。
使用一致的命名 — 选择 camelCase 或 snake_case 并坚持使用。大多数 JavaScript API 使用 camelCase;大多数 Python 和 Ruby API 使用 snake_case。
避免深度嵌套结构 — 如果你的 JSON 超过 3-4 层深度,考虑扁平化。深度嵌套使数据更难查询和转换。
日期使用 ISO 8601 — 始终将日期格式化为 "2026-04-07T10:00:00Z"。永远不要使用时间戳或特定区域的格式。
显式处理 null — 决定缺失字段应该是 null 还是完全省略,并保持一致。
生产环境压缩 — 在通过网络发送 JSON 之前删除空白。大多数框架会自动执行此操作。
考虑使用 JSON Lines 进行流式处理 — 对于大型数据集,使用 JSONL(每行一个 JSON 对象)而不是一个巨大的数组。这允许流式处理和逐行处理。
JSON 速查表
任务JavaScriptPython解析JSON.parse(str)json.loads(str)序列化JSON.stringify(obj)json.dumps(obj)美化打印JSON.stringify(obj, null, 2)json.dumps(obj, indent=2)读取文件JSON.parse(fs.readFileSync('f.json'))json.load(open('f.json'))写入文件fs.writeFileSync('f.json', JSON.stringify(obj))json.dump(obj, open('f.json','w'))验证try { JSON.parse(str) }try: json.loads(str)
亲自试试
准备好格式化、验证或比较 JSON 了吗?试试 FastUtil 的 JSON 格式化工具 — 粘贴你的 JSON,立即看到带有语法高亮、验证错误等的格式化结果。无需注册,所有处理都在你的浏览器中完成。
蔙的意思
快递柜取件码有效期多长 快递自取柜没有取件码怎么办