什么是 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:

Alice

30

admin

editor

在 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,立即看到带有语法高亮、验证错误等的格式化结果。无需注册,所有处理都在你的浏览器中完成。


蔙的意思
快递柜取件码有效期多长 快递自取柜没有取件码怎么办