【问题标题】:How can I push data to an array in a JSON file and save it?如何将数据推送到 JSON 文件中的数组并保存?
【发布时间】:2021-02-06 15:13:09
【问题描述】:

所以我试图将一个数组推送到一个已经是数组格式的 JSON 文件中。

The code im using to attempt this is:

needle.get("https://bpa.st/raw/VHVQ", function(response, body){
     let testlist = require('../testlist.json') 
     let list = response.body;
     let listarray = list.split("\r\n")
     for (var i of listarray) {
     testlist.push(i);
     }

当我的应用程序运行时,它将 testlist.json 显示为:

["1", "2", "this", "is", "an", "example", "for", "stackoverflow"]

现在它似乎工作正常,就像它更新了数组一样,但如果我检查它,它没有,如果我重新启动我的应用程序,它会重置为原始的未编辑版本。

testlist.json looks like this:

["1", "2"]

之后,我试图让它编辑 json 文件看起来像这样:

["1", "2", "this", "is", "an", "example", "for", "stackoverflow"]

【问题讨论】:

    标签: node.js arrays json npm node-modules


    【解决方案1】:

    当您使用require()testlist.json 的内容导入变量testlist 时,您正在将文件的内容加载到内存中。如果您希望修改保持不变,则需要在对 testlist 变量进行更改后回写文件。否则,您所做的更改将在程序进程退出时丢失。

    您可以使用fs 模块中的writeFileSync() 方法以及JSON.stringify()testlist 写回到testlist.json 文件中:

    const fs = require("fs");
    
    let testlist = require("../testlist.json");
    
    // Your code where you modify testlist goes here
    
    // Convert testlist to a JSON string
    const testlistJson = JSON.stringify(testlist);
    // Write testlist back to the file
    fs.writeFileSync("../testlist.json", testlistJson, "utf8");
    

    编辑:您还应该使用readFileSync() 方法(也来自fs 模块)和JSON.parse() 来执行JSON 文件的初始读取,而不是require()

    // This line
    let testlist = require("../testlist.json");
    
    // Gets replaced with this line
    let testlist = JSON.parse(fs.readFileSync("../testlist.json", "utf8"));
    

    您必须使用JSON.parsefs.readFileSync,因为当您读取文件时,它会被读取为字符串,而不是 JSON 对象。

    【讨论】:

    • 我对其进行了编辑以显示我遇到的问题!
    • 我已经编辑了我的答案,希望能以只读方式解决您的问题。我还注意到我错误地使用了fs.writeFile,而不是fs.writeFileSync,所以我现在也将其包括在内。
    • 很抱歉,我遇到了另一个问题并对其进行了编辑以显示更多内容,以便我们最终解决这个问题!
    • 您收到该错误是因为在该路径中找不到该文件。您确定testlist.json 文件位于该路径(不在同一目录中,而是在您使用../ 的上一个目录中)。另外,RE:您的编辑,您应该在 for 循环之外和之后调用 writeFileSync(),否则您在每次迭代期间写入文件,而不是在结束时写入文件。
    • 另外,如果您有后续错误,则不应编辑我的回复。要么使用评论,要么编辑您的原始问题(我已经为您完成了)。 :)
    猜你喜欢
    • 2021-10-11
    • 2015-03-31
    • 1970-01-01
    • 2011-04-11
    • 2020-12-28
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多