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' }。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台