You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何像Object.entries读取JSON文件对象?解决流式读取解析报错

问题原因

fs.createReadStream的data事件会分块返回文件内容,不是一次性提供完整的JSON字符串。你在每个不完整的小块上直接调用JSON.parse,自然会因为JSON语法不完整抛出错误——半拉子JSON肯定不符合格式要求。

解决方案

根据你的JSON文件类型,分两种场景处理:

场景1:文件是单个完整的JSON对象/数组

先把所有数据块拼接起来,等整个文件读完(end事件触发)再解析:

const fs = require('fs');
const filePath = './your-file.json';

let rawData = '';
const fileStream = fs.createReadStream(filePath, { encoding: 'utf8' });

fileStream.on('data', (chunk) => {
  rawData += chunk; // 逐个拼接数据块
});

fileStream.on('end', () => {
  try {
    const data = JSON.parse(rawData);
    // 用Object.entries遍历所有键值对
    for (const [key, value] of Object.entries(data)) {
      console.log(`键: ${key}, 值:`, value);
    }
    console.log('所有JSON键值对处理完成。');
  } catch (err) {
    console.error('JSON解析失败:', err);
  }
});

fileStream.on('error', (err) => {
  console.error('读取文件出错:', err);
});

场景2:文件是NDJSON格式(每行一个独立JSON对象)

如果你的文件是每行一个完整JSON(比如日志类文件),用readline模块逐行处理更高效,无需拼接整个文件:

const fs = require('fs');
const readline = require('readline');
const filePath = './your-ndjson-file.json';

const rl = readline.createInterface({
  input: fs.createReadStream(filePath, { encoding: 'utf8' }),
  crlfDelay: Infinity // 兼容所有换行符格式
});

rl.on('line', (line) => {
  try {
    const data = JSON.parse(line);
    for (const [key, value] of Object.entries(data)) {
      console.log(`键: ${key}, 值:`, value);
    }
  } catch (err) {
    console.error('解析单行JSON失败:', err);
  }
});

rl.on('close', () => {
  console.log('所有行处理完成。');
});
注意事项
  • 必须用try/catch包裹JSON.parse,避免文件本身格式错误导致程序崩溃
  • 如果是GB级别的超大JSON文件,场景1的拼接方式会占用大量内存,此时建议使用专门的JSON流式解析库(比如jsonstream),日常中小文件用上面两种方法足够

内容的提问来源于stack exchange,提问作者user25368986

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 05:07:17