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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 22:39:49