如何使用Node Js中的文件系统重写文件中的JSON对象

时间:2017-04-25 13:04:55

标签: javascript node.js fs

我在Node Js中使用fs遇到过读写操作。

我的情况就像是,我有一个包含数据的文件,

[
{
    "Pref":"Freedom",
    "ID":"5545"
},
{
    "Pref":"Growth",
    "ID":"8946545"
}
]

我必须使用Node js替换ID为5545的元素的Pref。

我该怎么办?谢谢

3 个答案:

答案 0 :(得分:1)

为了做你想做的事,你需要:

  1. 使用fs.readFile()
  2. 从文件中读取JSON数据
  3. 使用JSON.parse()
  4. 解析JSON
  5. 在数组中找到正确的对象
  6. 更改对象
  7. 使用JSON.stringify()
  8. 将对象序列化回JSON
  9. 使用fs.writeFile()
  10. 编写文件

    但这并不像看起来那么简单,因为你必须:

    • 为写入添加锁定,以便您不会同时执行两次写入
    • 为读取添加锁定,以便在写入进行时永远不会读取
    • 处理错误的JSON
    • 处理无法序列化的对象案例
    • 避免在事件循环的第一个刻度中阻止操作(在名称中使用"同步"在其他任何地方)

    考虑到所有这些,您应该考虑使用数据库来存储任何更改的数据。某些数据库(如Mongo,Postgres或Redis)需要作为独立应用程序在相同或不同的服务器上运行。像SQLite这样的嵌入式数据库不需要独立的流程,可以直接在您的应用程序中运行。

    并不是说不可能写入JSON文件然后根据需要读取这些文件,但是你必须做的工作量才能同步访问数据而不是偶然阻止事件循环的过程要比按预期使用任何数据库困难得多。

答案 1 :(得分:0)

你有一些数据:

for (i=0;i<comp.mesh.geometry.attributes.position.array.length;i++){
comp.mesh.geometry.attributes.normal.array[i*3 + 1]  = 0;
comp1.mesh.geometry.attributes.normal.array[i*3 + 1]  = 0;
}

首先,我们需要找到您要更改的元素(如果有多个ID为5545的项目,请使用const data = [ { "Pref":"Freedom", "ID":"5545" }, { "Pref":"Growth", "ID":"8946545" } ] 仅选择第一个元素:

[0]

然后改变它!

const objectToChange = data.filter(item => item.ID === "5545")[0]

我们可以看到数据对象中反映的变化:

objectToChange['Pref'] = "Liberty"

答案 2 :(得分:0)

1-加载文件:let json = JSON.parse(fs.readFileSync('file.json', 'utf-8'));

2-更新内容:

json = json.map(el => {
  if(el.ID === "5545") {
    el.Pref = "TEST";
  }
  return el;
});

3-再次保存?

fs.writeFileSync('test.json', JSON.stringify(json), 'utf-8');