Node.js使用JSON.parse解析文件时报Unexpected end of JSON input错误如何解决
问题原因与解决方案
你遇到的两个报错关联逻辑为:
Uncaught SyntaxError: Unexpected end of JSON input是根因,JSON解析失败抛出未捕获的异常导致进程崩溃,才触发了nodemon的[nodemon] app crashed - waiting for file changes before starting提示。
核心报错原因
JSON.parse()只能接收完整、格式合法的JSON字符串,触发报错的常见原因如下:
- 按
\n拆分txt内容后,最后一行大概率是空字符串(绝大多数txt文件末尾会自带换行符),空内容传入JSON.parse()直接触发语法错误 - 部分行替换单引号为双引号后,本身仍然不符合JSON格式要求,比如存在未闭合的引号、多余的逗号、属性名未加引号等问题
- 原代码逻辑存在瑕疵:初始定义
file_Data为数组,循环中直接给它赋值为字符串,解析结果会被逐次覆盖,不过这不是触发本次报错的直接原因
修复方案
修复后的完整代码如下:
const fs = require('fs'); fs.readFile("./Files/success-2021-10-16.txt", "utf8", (err, data) => { if (err) throw new Error("Testing error messages here..."); // 拆分后先过滤空行、纯空格行 const lineArray = data.toString().split("\n").filter(line => line.trim() !== ''); const parsedData = []; for (const line of lineArray) { try { // 替换单引号为双引号后解析 const processedLine = line.replace(/'/g, '"'); const parsedLine = JSON.parse(processedLine); parsedData.push(parsedLine); console.log('解析成功:', parsedLine); } catch (parseError) { // 捕获单条解析错误,不会导致整个进程崩溃 console.error(`解析失败,行内容:${line},错误信息:${parseError.message}`); } } console.log(`解析完成,共成功解析${parsedData.length}条数据`); });
改动说明
- 拆分换行后新增过滤逻辑,排除空行、纯空格行,避免无效内容传入JSON.parse
- 新增
try/catch包裹JSON解析逻辑,单条内容解析失败只会打印错误日志,不会抛出未捕获异常导致整个进程崩溃,nodemon就不会触发服务挂掉的提示 - 修正原数组存储逻辑,用push方法把每条解析成功的结果存入数组,避免结果被覆盖
- 把
for...in遍历数组改为for...of,避免遍历到数组原型上的额外属性导致异常
内容的提问来源于stack exchange,提问作者Aqdas ilyas
相关产品推荐
相关产品推荐

