JSON 处理在 Node.js:完整指南
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,基于 JavaScript 对象语法。在 Node.js 环境中,处理 JSON 是一项日常任务:从配置文件到 API 请求。本文将详细解析 JSON 处理的所有方面,包括解析、序列化、验证以及处理大文件。
基本方法:JSON.parse() 和 JSON.stringify()
处理 JSON 的两个主要方法直接内置于 JavaScript 中。它们是全局可用的,无需安装额外的库。
JSON.parse() — 将字符串转换为对象
JSON.parse() 方法接受一个 JSON 字符串并返回相应的 JavaScript 对象。如果字符串包含无效的 JSON,将抛出 SyntaxError 异常。
const jsonString = '{"name": "安娜", "age": 28, "isStudent": false}';const user = JSON.parse(jsonString);console.log(user.name); // "安娜"console.log(user.age); // 28第二个可选参数可以传递一个 reviver 函数,它允许在解析过程中修改值:
const json = '{"year": "2024", "price": "1500.50"}';const data = JSON.parse(json, (key, value) => { if (key === 'price') return parseFloat(value); if (key === 'year') return parseInt(value); return value;});console.log(typeof data.price); // "number"JSON.stringify() — 将对象转换为字符串
JSON.stringify() 方法执行相反操作:将对象或值转换为 JSON 字符串。它最多接受三个参数:值、替换函数或键数组,以及用于格式化的空格数量。
const user = { name: "伊万", age: 32, skills: ["JS", "Node", "Python"]};
// 无格式化console.log(JSON.stringify(user));// {"name":"伊万","age":32,"skills":["JS","Node","Python"]}
// 带格式化(2个空格)console.log(JSON.stringify(user, null, 2));/*{ "name": "伊万", "age": 32, "skills": [ "JS", "Node", "Python" ]}*/第二个参数可以是用于过滤的键数组:
console.log(JSON.stringify(user, ['name', 'age']));// {"name":"伊万","age":32}在 Node.js 中处理 JSON 文件
在 Node.js 中,经常需要读取和写入 JSON 文件。为此使用 fs(文件系统)模块。
读取 JSON 文件
const fs = require('fs');
// 同步读取try { const data = fs.readFileSync('config.json', 'utf8'); const config = JSON.parse(data); console.log(config.port);} catch (err) { console.error('读取文件错误:', err.message);}
// 异步读取fs.readFile('config.json', 'utf8', (err, data) => { if (err) { console.error('错误:', err); return; } const config = JSON.parse(data); console.log(config.port);});写入 JSON 文件
const fs = require('fs');
const settings = { theme: 'dark', language: 'ru', fontSize: 14};
// 同步写入fs.writeFileSync('settings.json', JSON.stringify(settings, null, 2));
// 异步写入fs.writeFile('settings.json', JSON.stringify(settings, null, 2), (err) => { if (err) console.error('写入错误:', err); else console.log('文件已保存');});JSON 验证
在使用数据之前,始终应该检查其有效性。最简单的方法是将 JSON.parse() 包装在 try-catch 中。对于更复杂的结构验证,可以使用库。
使用 try-catch 检查
function safeJsonParse(str) { try { return { data: JSON.parse(str), error: null }; } catch (e) { return { data: null, error: e.message }; }}