如何像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
相关产品推荐
相关产品推荐

