Node.js 如何读取 JSON 文件到内存
Node.js 读取 JSON 文件:fs.readFile 读文本后 JSON.parse 解析,或 fs.promises 配合 await。小配置文件也可直接 require('./config.json')(会缓存)。注意 JSON.parse 需 try-catch 容错。
两步:用 fs 模块读出文本,再 JSON.parse() 解析成对象。 推荐用 fs/promises 配 async/await;读取和解析都应有明确的错误处理;JSON.parse 是同步操作,格式非法会抛异常。异步读取不会让解析本身变成异步,也不会自动验证业务字段。小的静态配置文件还可以直接 require(),会自动解析并缓存。
标准写法(async/await)
const fs = require('fs/promises');
async function loadConfig() {
try {
const text = await fs.readFile('./config.json', 'utf8');
const config = JSON.parse(text);
console.log(config);
return config;
} catch (err) {
console.error('读取或解析失败:', err.message);
}
}
fs.readFile 的相对路径基于进程工作目录,不是当前模块目录。上例失败时记录错误并返回 undefined,调用方应处理失败,或改为重新抛出错误。
回调式
const fs = require('fs');
fs.readFile('./config.json', 'utf8', (err, data) => {
if (err) return console.error('读取失败:', err);
try {
const json = JSON.parse(data);
console.log(json);
} catch (e) {
console.error('JSON 格式错误:', e);
}
});
快捷方式:require
const config = require('./config.json'); // 自动 parse,且结果被缓存
注意三点:./ 和 ../ 路径相对当前模块,也可使用绝对路径;CommonJS 内容被缓存,清除对应 require.cache 只影响后续加载,不更新已有引用;适合可信的静态文件。
大文件别一次读
几百 MB 的 JSON(如日志导出)一次性读取和解析可能消耗数倍于文件大小的内存,并长时间阻塞事件循环;是否溢出取决于可用内存和数据结构。改用流式解析库(stream-json)按记录逐条处理。
常见问题(FAQ)
Q:JSON.parse 报 "Unexpected token"?
文件不是合法 JSON:可能是 BOM 头(先 text.replace(/^\uFEFF/, ''))、尾逗号、注释(标准 JSON 不允许),或文件其实是 JSON Lines。
Q:JSON Lines(.jsonl)怎么读?
逐行读再逐行 parse:读出文本后 text.split('\n').filter(line => line.trim()).map(line => JSON.parse(line)),大文件用 readline 流式逐行。
Q:ESM 项目里怎么读?
import { readFile } from 'node:fs/promises' 后同上;import attributes 在 Node 20.10.0 引入、20.18.3 起不再是实验功能;支持该语法的版本可用 import data from './config.json' with { type: 'json' }。