Node.js将JSON转为TXT时循环输出单个字符的问题求助
问题:遍历JSON文件时输出单个字符,无法生成正确格式化TXT文件
我收集数据并存入intake.json文件(该文件为对象数组格式),编写convertToTxt函数期望将其转为格式化TXT文件,但循环中console.log(element)时输出单个字符,示例如下:
D a t e : 0 6 / 1 2 / 2 4
以下是我的index.js代码:
#!/usr/bin/env node const style = require('node:util'); const yargs = require("yargs"); const prompt = require('prompt-sync')({sigint: true}); const fs = require('node:fs'); console.clear(); const intakeType = prompt(style.styleText('green','Please Enter the intake type:')); const date = prompt(style.styleText('green','Please enter the intake date (mm/dd/yy): ')); const project = prompt(style.styleText('green','Please Enter the Project: ')); const reporter = prompt(style.styleText('green','Please enter the reporter: ')); const team = prompt(style.styleText('green','Please enter the team of the report: ')); const time = prompt(style.styleText('green','Please enter the time taken: ')); const details = prompt(style.styleText('green','Please enter the details of the intake: ')); const resolution = prompt(style.styleText('green','Please enter the resolution type: ')); const content = { intakeType, date, project, reporter, team, time, details, resolution } const JSONToFile = (obj) => { fs.readFile("intake.json", { flag: 'r' }, function(err, json) { var array = JSON.parse(json); array.push(obj); if(err){ console.log(err); return; } fs.writeFile("intake.json", JSON.stringify(array, null, 2), { flag: 'w' }, function(err) { if (err) { console.log(err); return; } console.log("The intake was saved!"); }); }); } JSONToFile(content); // function to convert the json file to a .txt file const convertToTxt = () => { fs.readFile("intake.json", "utf8", function(err, json) { if (err) { console.log(err); } const writtenData = [] for (let index = 0; index < json.length; index++) { const element = json[index]; console.log('element', element); writtenData.push( ` Date: ${element.date} \n Reporter: ${element.reporter} \n Time Taken: ${element.time} \n Team: ${element.team} \n Project: ${element.project} \n Intake Type: ${element.intakeType} \n Details: ${element.details} \n Resolution: ${element.resolution}\n\n `) } fs.writeFile("intake.txt", JSON.stringify(writtenData, null, 2), function(err) { if (err) { console.log(err); } else { console.log(style.styleText('green','Text file successfully created')) } }); }); } convertToTxt('intake.json');
错误原因
你直接遍历了fs.readFile读取到的JSON字符串,而非解析后的对象数组。字符串在遍历过程中会逐个返回每个字符,所以会出现单个字符输出的情况。此外还存在两个问题:
JSONToFile是异步操作,convertToTxt可能在JSON文件写入完成前就执行读取,导致读取到旧数据;- 写入TXT时使用
JSON.stringify会把数组转成JSON格式字符串,生成的TXT会包含引号和转义符,不符合预期的格式化文本。
修复后的代码
#!/usr/bin/env node const style = require('node:util'); const prompt = require('prompt-sync')({ sigint: true }); const fs = require('node:fs'); console.clear(); // 收集用户输入 const intakeType = prompt(style.styleText('green', 'Please Enter the intake type:')); const date = prompt(style.styleText('green', 'Please enter the intake date (mm/dd/yy): ')); const project = prompt(style.styleText('green', 'Please Enter the Project: ')); const reporter = prompt(style.styleText('green', 'Please enter the reporter: ')); const team = prompt(style.styleText('green', 'Please enter the team of the report: ')); const time = prompt(style.styleText('green', 'Please enter the time taken: ')); const details = prompt(style.styleText('green', 'Please enter the details of the intake: ')); const resolution = prompt(style.styleText('green', 'Please enter the resolution type: ')); const content = { intakeType, date, project, reporter, team, time, details, resolution }; // 封装为Promise,方便处理异步顺序 const JSONToFile = (obj) => { return new Promise((resolve, reject) => { fs.readFile("intake.json", { flag: 'r' }, function (err, json) { if (err) { console.log(err); reject(err); return; } let array = []; try { array = JSON.parse(json); } catch (parseErr) { // 处理文件为空或格式错误的情况 console.log('JSON解析错误,初始化空数组'); } array.push(obj); fs.writeFile("intake.json", JSON.stringify(array, null, 2), { flag: 'w' }, function (err) { if (err) { console.log(err); reject(err); return; } console.log("The intake was saved!"); resolve(); }); }); }); }; // 转换为TXT的函数 const convertToTxt = () => { fs.readFile("intake.json", "utf8", function (err, json) { if (err) { console.log(err); return; } let intakeArray = []; try { intakeArray = JSON.parse(json); } catch (parseErr) { console.log('JSON解析错误'); return; } // 遍历解析后的对象数组,拼接格式化文本 const writtenData = intakeArray.map(element => `Date: ${element.date} Reporter: ${element.reporter} Time Taken: ${element.time} Team: ${element.team} Project: ${element.project} Intake Type: ${element.intakeType} Details: ${element.details} Resolution: ${element.resolution} `).join(''); fs.writeFile("intake.txt", writtenData, function (err) { if (err) { console.log(err); } else { console.log(style.styleText('green', 'Text file successfully created')); } }); }); }; // 先完成JSON写入,再执行转换 JSONToFile(content) .then(() => convertToTxt()) .catch(err => console.log('操作失败:', err));
关键修复点
- 解析JSON字符串:在
convertToTxt中先通过JSON.parse(json)将读取到的字符串转为对象数组,再遍历数组中的每个对象; - 处理异步顺序:将
JSONToFile封装为Promise,确保在JSON文件写入完成后再执行convertToTxt,避免读取到未更新的数据; - 生成正确的TXT格式:使用
map遍历数组并拼接格式化字符串,最后用join('')合并为单个文本字符串,写入TXT时不再使用JSON.stringify,保证输出的是纯文本格式。
内容的提问来源于stack exchange,提问作者Charles L.
相关产品推荐
相关产品推荐

