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 必须包 try-catch,因为格式非法会抛同步异常。小的静态配置文件还可以直接 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);
}
}
回调式
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,且结果被缓存
注意三点:路径必须带 ./(相对当前文件);内容被缓存,文件改动后需清 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(Boolean).map(JSON.parse),大文件用 readline 流式逐行。
Q:ESM 项目里怎么读?
import { readFile } from 'node:fs/promises' 后同上;Node 20+ 也支持 import data from './config.json' with { type: 'json' }。