【问题标题】:Adding a new key value inside a JSON file using NodeJS使用 NodeJS 在 JSON 文件中添加新的键值
【发布时间】:2020-04-22 05:51:29
【问题描述】:

这是我想要在我的 Javascript 文件中执行的操作:

const file = require('../../data/files.json');
var data = {
  "wolf": {"nani": "awoo"},
  "loli": {"nani": "kimochi"}
}

file.push(data);

我当前的 .json 文件内容:

{
  "cat" : {
    "nani": "meow"
  },
  "dog": {
    "nani": "woof"
  }
}

在使用 NodeJS 写入 JSON 文件后,我希望我的 .json 文件是这样的:

{
  "cat" : {
    "nani": "meow"
  },
  "dog": {
     "nani": "woof"
  },
  "wolf": {
    "nani": "awoo"
  },
  "loli": {
    "nani": "kimochi"
  }
}

这可能吗?如果可以的话谢谢~!

【问题讨论】:

    标签: javascript node.js json discord.js


    【解决方案1】:

    是的,当然可以在运行时修改 JSON。但是,您当前的方法存在三个问题。

    1. file.push(data) - .push() 是数组上的函数。然而,file 不是一个数组,它是一个对象。您可以使用Object.assign(file, data) 之类的东西将data 中的所有属性分配给file

    2. 您的 data 与您希望 JSON 结果的格式不同。例如,不是"wolf": "awoo",而是"wolf": { "nani": "awoo" }。您可以将其保留为当前格式,但您必须转换数据才能获得正确的结果格式。

    3. 以这种方式修改 JSON 只会在 require() 读取时修改内存中保存的 JSON 的副本。您仍然需要保存这个修改后的 JSON 副本。就像在文本编辑器中一样,在您点击保存按钮之前,您的更改不会被保存。为此,您可以使用fs.writeFileJSON.stringify

      //import the standard filesystem module to read/write files and folders
      const fs = require("fs"); 
      
      //after you modify your data use this to save the changes
      fs.writeFile("../../data/files.json", JSON.stringify(file), err => {
          if(err) console.log(err);
      });
      

    JSON.stringify 是必需的,因为const file = require(...); 会将 JSON 转换为 JavaScript 对象。 JSON 只是文本,JS 对象是内存中的数据结构,具有原型和属性等。 JSON.stringify 将其转换回文本,因此您可以保存对象的文本版本。


    与您的问题无关,但我看到您使用的是 discord.js,所以这可能是针对不和谐机器人的。如果您打算使用命令修改此 JSON,请注意,如果您的机器人被添加到许多服务器,JSON 存储将变得非常不稳定,并且将来可能会丢失/损坏数据。发生这种情况的原因有很多,但这是因为每次更改数据时都需要完全重写文件,如果在重写过程中进程失败,它就会处于损坏状态。

    我强烈建议使用适当的数据库解决方案来存储动态数据,例如 postgres、redis 或任何其他 SQL/NoSQL 解决方案。

    【讨论】:

    • 嗨~我收到以下错误:UnhandledPromiseRejectionWarning: TypeError [ERR_INVALID_CALLBACK]: Callback must be a function. Received undefined
    • @YazukiRin 我已经用writeFile 的回调编辑了答案。必须是最新版本的 node 需要它。
    • 非常感谢!它工作得很好!也谢谢你的建议!我正在为我的 Discord Bot 的数据库使用 SQLite~!你帮了大忙! :D
    • @YazukiRin 这是一个不错的选择。我很高兴这个答案对你有用。 :)
    【解决方案2】:

    你可以这样试试

    let file = require('../../data/files.json');
    console.log(file);
    
    // to add key value pair in any Object use like this :-
    // object['key'] = 'value'
    file['wolf'] = {
        "nani": "awoo"
    }
    file['loli'] = {
        "nani": "kimochi"
    }
    console.log(file);
    

    【讨论】:

    • 我有点想把它写到.json文件中,如果我让你误解了,对不起:(
    【解决方案3】:

    您必须读入文件内容,添加更改并再次写出文件。

    你所做的会导致:

    {
      "cat" : {
        "nani": "meow"
      },
      "dog": {
        "nani": "woof"
      }
    }
    {
      "wolf": {
        "nani": "awoo"
      },
      "loli": {
        "nani": "kimochi"
      }
    }
    

    您不能只附加到 JSON,您需要对其进行修改。要修改它,您需要对其进行解析。

    【讨论】:

      猜你喜欢
      • 2020-04-22
      • 1970-01-01
      • 2018-01-25
      • 1970-01-01
      • 1970-01-01
      • 2017-10-17
      • 2020-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多