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

如何区分JSON中的实际换行与\n字符并抛出对应解析错误?

问题分析与解决

你的解析器不符合JSON规范——JSON字符串中不允许存在未经转义的实际换行符,VS Code的报错是符合标准的,而你的解析器错误地将文件中的实际换行视为字符串内的合法内容,所以没有触发错误。

核心区别:实际换行与转义\n

  • 实际换行:磁盘文件中是ASCII码0x0A的字符,通过fs.readFileSync读取后,在JS中表现为单个\n字符。
  • 转义\n:磁盘文件中是两个连续字符\(0x5C)和n(0x6E),读取后在JS中表现为'\\n'(两个独立字符)。

你可以通过字符的编码值区分二者:实际换行的charCodeAt结果是10,转义\n的第一个字符\的charCodeAt是92,第二个n是110。

修复解析逻辑的步骤

在解析JSON字符串的阶段,需要加入以下判断逻辑:

  1. 进入字符串模式(遇到起始"后),开启一个inEscape标记,初始为false。
  2. 遍历字符串内的每个字符:
    • 如果当前字符是\,将inEscape设为true,跳过下一个字符(属于转义序列的一部分)。
    • 如果inEscape为true,重置标记为false,继续遍历。
    • 如果当前字符是实际换行符(charCodeAt(index) === 10)且inEscape为false,直接抛出**“字符串意外终止”**的错误。
    • 如果遇到结束",退出字符串模式,继续解析后续内容。

核心逻辑示例代码:

function parseString(chars, index) {
  let result = '';
  let inEscape = false;
  index++; // 跳过起始的双引号
  while (index < chars.length) {
    const char = chars[index];
    if (inEscape) {
      result += char;
      inEscape = false;
      index++;
      continue;
    }
    if (char === '\\') {
      inEscape = true;
      index++;
      continue;
    }
    if (char === '"') {
      return { value: result, index: index + 1 };
    }
    // 检测未转义的实际换行
    if (char.charCodeAt(0) === 10) {
      throw new Error('字符串意外终止');
    }
    result += char;
    index++;
  }
  // 遍历到结尾未找到闭合双引号也报错
  throw new Error('字符串意外终止');
}

这样就能在遇到未转义的实际换行时,正确抛出符合预期的错误,完全遵循JSON标准。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 01:36:04