一、JSON(JavaScript Object Notation)
1. 数据类型与语法细节
支持的数据类型:
- 基本类型:字符串(需用双引号)、数字、布尔值(
true/false
)、null
。 - 复杂类型:数组(
[]
)、对象({}
)。
- 基本类型:字符串(需用双引号)、数字、布尔值(
严格语法规范:
- 键名必须用双引号包裹(如
"name": "张三"
)。 - 数组元素用逗号分隔,最后一个元素后不能有多余逗号。
- 数字不能以
0
开头(如012
会被解析为12
),不支持八进制 / 十六进制表示。
- 键名必须用双引号包裹(如
特殊场景示例:
json
{ "timestamp": 1686528000, "isAdmin": null, "emptyArray": [], "nestedObject": { "nestedArray": [1, 2, {"key": "value"}] }, "escapedString": "Hello \"World\" \\n Newline" // 转义字符:\", \/, \b, \f, \n, \r, \t }
2. JSON 与 JavaScript 对象的区别
特性 | JSON | JavaScript 对象 |
---|---|---|
语法限制 | 键名必须用双引号 | 键名可省略引号(非字符串键) |
数据类型 | 无函数、Symbol、Date 等 | 支持全部 JS 数据类型 |
序列化 | JSON.stringify() |
需手动处理复杂类型 |
原型链 | 不保留原型链 | 包含原型链属性 |
3. JSON 解析与序列化进阶
循环引用处理:
javascript
const obj = { name: '循环对象' }; obj.self = obj; // JSON.stringify(obj) 会报错 // 解决方案:使用replacer函数过滤循环引用 JSON.stringify(obj, (key, value) => { if (value === obj) return '[Circular Reference]'; return value; });
大 JSON 数据处理:
- 分段解析:使用
JSON.parse()
的reviver
参数逐步处理。 - 流式解析:Node.js 中可用
JSONStream
库处理 GB 级 JSON 文件。
- 分段解析:使用
JSON Schema 验证:
使用ajv
等库验证 JSON 数据格式,例如:javascript
const Ajv = require('ajv'); const ajv = new Ajv(); const schema = { type: 'object', properties: { name: { type: 'string' }, age: { type: 'number', minimum: 18 } }, required: ['name', 'age'] }; const valid = ajv.validate(schema, { na