JSON完全指南:从入门到最佳实践
JSON(JavaScript Object Notation)是目前互联网上最流行的数据交换格式之一。它轻量、易读、跨语言支持,几乎每一位开发者每天都在与之打交道。本文带你从语法基础到高级应用,全面掌握 JSON 的核心知识和最佳实践。
一、JSON 是什么
JSON 是一种轻量级的数据交换格式,由 Douglas Crockford 在 2001 年左右正式推广。它基于 JavaScript 语法的子集,但完全独立于编程语言。几乎所有主流语言都内置或提供了 JSON 解析库。
JSON 的设计目标是易于人阅读和编写,同时易于机器解析和生成。这两个特性使它迅速取代 XML 成为 Web API 的首选数据格式。
二、JSON 语法规则
JSON 的语法非常简洁,只有几个基本规则需要记住:
- 数据以键值对(key-value)形式存在
- 键名必须用双引号包裹,且必须是字符串
- 数据之间用逗号分隔
- 大括号
{}表示对象 - 中括号
[]表示数组 - 不允许注释
- 最后一个键值对后面不能有尾随逗号
2.1 支持的数据类型
JSON 支持以下 6 种数据类型:
- 字符串(string):双引号包裹,支持 Unicode 和转义字符
- 数字(number):整数或浮点数,不区分整型和浮点型
- 布尔值(boolean):true 或 false
- 数组(array):有序的值集合,用中括号包裹
- 对象(object):无序的键值对集合,用大括号包裹
- null:空值
2.2 简单示例
{
"name": "张三",
"age": 28,
"isStudent": false,
"hobbies": ["编程", "阅读", "跑步"],
"address": {
"city": "成都",
"district": "高新区",
"street": null
}
}
三、JSON 在 JavaScript 中的使用
JavaScript 提供了两个核心方法来处理 JSON:
3.1 JSON.parse() — 解析 JSON 字符串
将 JSON 字符串转换为 JavaScript 对象:
const jsonStr = '{"name":"张三","age":28}';
const obj = JSON.parse(jsonStr);
console.log(obj.name); // 张三
JSON.parse() 还支持第二个参数 reviver 函数,可以在解析过程中转换值:
const data = JSON.parse(jsonStr, (key, value) => {
if (key === 'age') return value + 1;
return value;
});
3.2 JSON.stringify() — 序列化为字符串
将 JavaScript 对象转换为 JSON 字符串:
const obj = { name: "张三", age: 28 };
const str = JSON.stringify(obj);
// '{"name":"张三","age":28}'
第二个参数 replacer 可以过滤或转换值,第三个参数 space 控制缩进美化输出:
const pretty = JSON.stringify(obj, null, 2);
console.log(pretty);
四、常见使用场景
- Web API 数据交换:前后端通信的标准格式
- 配置文件:package.json、tsconfig.json 等
- 本地存储:localStorage / sessionStorage 只能存字符串,通常用 JSON 序列化
- 数据持久化:NoSQL 数据库(如 MongoDB)广泛使用类 JSON 格式
- 日志格式:结构化日志普遍采用 JSON 格式
五、最佳实践
5.1 命名规范
业界主流使用驼峰式(camelCase)或下划线式(snake_case)。与 JavaScript 交互时推荐 camelCase,与 Python/Ruby 交互时 snake_case 更自然。关键是保持一致,不要混用。
5.2 处理循环引用
如果对象存在循环引用,JSON.stringify() 会抛出 TypeError。可以使用 WeakMap 实现安全序列化:
function safeStringify(obj) {
const seen = new WeakSet();
return JSON.stringify(obj, (key, value) => {
if (typeof value === 'object' && value !== null) {
if (seen.has(value)) return;
seen.add(value);
}
return value;
});
}
5.3 大数字精度问题
JSON 数字在 JavaScript 中会被解析为 64 位浮点数,超过 2^53 的整数会丢失精度。对于 ID 等大数字,建议以字符串形式传输。
5.4 安全注意事项
- 永远不要使用
eval()解析 JSON,应始终使用JSON.parse() - 从不可信来源接收 JSON 时,要做数据校验
- 防范 JSON 注入攻击,对用户输入做转义处理
六、JSON 的替代方案
虽然 JSON 是目前的主流,但在一些特定场景下,其他格式可能更适合:
- YAML:配置文件场景,可读性更好,支持注释
- Protocol Buffers:高性能 RPC 场景,二进制格式更小更快
- MessagePack:更小的二进制 JSON 替代
- TOML:配置文件,语法更简洁直观
- JSON5:JSON 的超集,支持注释、尾随逗号、单引号等
七、实用工具推荐
在日常开发中,以下工具能大大提升处理 JSON 的效率:
- DevToolHub JSON 格式化工具:在线格式化、压缩、校验 JSON
- jq:命令行下的 JSON 处理利器
- JSON Schema:为 JSON 数据定义结构校验规则
总结
JSON 是现代 Web 开发中不可或缺的基础技能。理解它的语法规则、掌握 JavaScript 中的解析与序列化方法、了解常见坑点和最佳实践,能让你在日常开发中更加游刃有余。对于大多数场景,JSON 仍然是数据交换格式的最佳选择。