JSON简介及其在JavaScript中的作用
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,基于JavaScript对象语法。尽管源于JavaScript,JSON已成为服务器与客户端之间传输结构化数据的通用标准,也用于存储配置和在微服务架构中交换信息。
在Node.js环境中,处理JSON是日常任务:从读取配置文件到处理REST API响应。本文将详细介绍两个关键方法——JSON.parse()和JSON.stringify(),并分析常见错误和最佳实践。
1. 解析JSON:JSON.parse()方法
JSON.parse()方法将JSON格式的字符串转换为JavaScript对象。当您从服务器、文件或外部源接收数据时,需要使用此方法。
基本语法
const jsonString = '{"name": "安娜", "age": 30, "isStudent": false}';const user = JSON.parse(jsonString);console.log(user.name); // "安娜"console.log(user.age); // 30高级用法:reviver函数
JSON.parse()的第二个参数可以接受一个转换函数(reviver),允许在解析过程中修改值。这对于将字符串日期转换为Date对象或验证数据非常有用。
const jsonData = '{"date": "2024-01-15T10:30:00.000Z", "value": 42}';const parsed = JSON.parse(jsonData, (key, value) => { if (key === 'date') { return new Date(value); } return value;});console.log(parsed.date instanceof Date); // trueconsole.log(parsed.date.toLocaleDateString()); // "2024/01/15"解析错误处理
无效的JSON会抛出SyntaxError异常。始终将JSON.parse()调用包裹在try...catch块中:
function safeParse(jsonString) { try { return { data: JSON.parse(jsonString), error: null }; } catch (error) { console.error('JSON解析错误:', error.message); return { data: null, error: error.message }; }}
const result = safeParse('{"name": "错误"}');console.log(result.data.name); // "错误"2. 序列化为JSON:JSON.stringify()方法
JSON.stringify()方法执行相反的任务——将JavaScript对象转换为JSON字符串。这用于向服务器发送数据、保存状态或记录日志。
基本语法
const user = { name: '伊万', age: 25, skills: ['JavaScript', 'Node.js']};
const jsonString = JSON.stringify(user);console.log(jsonString);// {"name":"伊万","age":25,"skills":["JavaScript","Node.js"]}格式化参数
JSON.stringify()的第三个参数允许设置缩进,使输出更易读。这在写入文件或调试时特别有用。
const config = { server: { port: 3000, host: 'localhost' }, database: { host: 'db.example.com', port: 5432 }};
// 紧凑输出console.log(JSON.stringify(config));
// 带2个空格缩进的易读输出console.log(JSON.stringify(config, null, 2));// {// "server": {// "port": 3000,// "host": "localhost"// },// ...// }使用replacer过滤属性
第二个参数是一个数组或函数,用于确定结果字符串中包含哪些属性。
const user = { id: 1, name: '玛丽亚', email: 'maria@example.com', password: 'secret123', role: 'admin'};
// 排除敏感数据const safeUser = JSON.stringify(user, ['id', 'name', 'email', 'role']);console.log(safeUser);// {"id":1,"name":"玛丽亚","email":"maria@exa