如何用TypeScript读取换行分隔多JSON对象的文本文件?
解决TypeScript解析换行分隔JSON文件的问题
常见原因及对应方案
1. JSON对象内部包含换行符
如果你的JSON文件里的对象是格式化后的(带缩进换行),直接按\n分割会把单个JSON拆成多行,导致第一行只是JSON的一部分,自然解析失败。
解决方法:通过跟踪括号/引号配对判断JSON完整性,逐行累加直到能完整解析:
import * as fs from 'fs'; import * as readline from 'readline'; async function parseJsonLinesFile(filePath: string) { const rl = readline.createInterface({ input: fs.createReadStream(filePath), crlfDelay: Infinity }); let buffer = ''; let isFirstObject = true; let cityJson: any; const cityJsonFeatures: any[] = []; for await (const line of rl) { buffer += line; try { const obj = JSON.parse(buffer); if (isFirstObject) { cityJson = obj; isFirstObject = false; } else { cityJsonFeatures.push(obj); } buffer = ''; } catch (e) { continue; } } // 处理文件末尾未换行的剩余内容 if (buffer) { try { const obj = JSON.parse(buffer); isFirstObject ? cityJson = obj : cityJsonFeatures.push(obj); } catch (e) { console.error('剩余内容解析失败:', e); } } return { cityJson, cityJsonFeatures }; } // 调用示例 parseJsonLinesFile('./your-file.json').then(result => { console.log('CityJSON:', result.cityJson); console.log('Features:', result.cityJsonFeatures); }).catch(err => console.error(err));
2. 换行符格式问题(Windows的\r\n)
若文件用Windows风格换行符\r\n,直接split('\n')会让行尾带\r字符,导致解析报错。
解决方法:用正则兼容所有换行符,同时过滤空行:
const content = fs.readFileSync('./your-file.json', 'utf8'); const lines = content.split(/\r?\n/).filter(line => line.trim() !== '');
3. 文件末尾存在空行
文件末尾空行被分割后会得到空字符串,解析空字符串必然报错,同样用上面的filter方法过滤空行即可。
4. 第一行JSON本身不完整
先打印lines[0]查看具体内容,确认是否是有效的JSON字符串——比如是否缺少闭合括号、引号未配对,这类情况需要修正文件内容。
额外提示
如果你的文件是标准JSON Lines(.jsonl)格式(每个JSON独占一行,无内部换行),确保处理换行符并过滤空行即可;非标准格式则必须用括号配对的方式判断JSON完整性。
内容的提问来源于stack exchange,提问作者pcace
相关产品推荐
相关产品推荐

