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

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字符串,而非解析后的对象数组。字符串在遍历过程中会逐个返回每个字符,所以会出现单个字符输出的情况。此外还存在两个问题:

  1. JSONToFile是异步操作,convertToTxt可能在JSON文件写入完成前就执行读取,导致读取到旧数据;
  2. 写入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));

关键修复点

  1. 解析JSON字符串:在convertToTxt中先通过JSON.parse(json)将读取到的字符串转为对象数组,再遍历数组中的每个对象;
  2. 处理异步顺序:将JSONToFile封装为Promise,确保在JSON文件写入完成后再执行convertToTxt,避免读取到未更新的数据;
  3. 生成正确的TXT格式:使用map遍历数组并拼接格式化字符串,最后用join('')合并为单个文本字符串,写入TXT时不再使用JSON.stringify,保证输出的是纯文本格式。

内容的提问来源于stack exchange,提问作者Charles L.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 00:22:26