如何区分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字符串的阶段,需要加入以下判断逻辑:
- 进入字符串模式(遇到起始
"后),开启一个inEscape标记,初始为false。 - 遍历字符串内的每个字符:
- 如果当前字符是
\,将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
相关产品推荐
相关产品推荐

