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

Posted

技术标签:

【中文标题】如何使用 Node Js 中的文件系统重写文件中的 JSON 对象【英文标题】:How do I rewrite the JSON object in a file using file system in Node Js 【发布时间】:2017-09-22 12:26:56 【问题描述】:

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

我的情况是,我有一个文件,其中包含类似的数据,

[

    "Pref":"Freedom",
    "ID":"5545"
,

    "Pref":"Growth",
    "ID":"8946545"

]

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

我该怎么做。谢谢

【问题讨论】:

通过尝试真正写一些东西,当卡住然后在这里问这个具体问题 您可以使用 Node fs API readFilereadFileSync ( nodejs.org/api/fs.html ) 读取文件,进行更改然后重写文件。 【参考方案1】:

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

    从带有fs.readFile()的文件中读取JSON数据 用JSON.parse()解析JSON 在数组中找到正确的对象 更改对象 使用JSON.stringify()将对象序列化回JSON 用fs.writeFile()写入文件

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

为写入添加锁定,这样您就不会同时进行两次写入 为读取添加锁定,以便您在写入过程中永远不会阅读 处理不正确的 JSON 处理无法序列化的对象情况 避免阻塞操作(名称中带有“Sync”的操作),然后在事件循环的第一个滴答声中进行

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

并不是不可能写入 JSON 文件然后根据需要读取这些文件,而是您必须做大量工作才能同步对数据的访问,而不会意外阻塞事件循环中的事件循环这个过程比仅仅按预期使用任何数据库要困难得多。

【讨论】:

很好的解释@rsp!【参考方案2】:

你有一些数据:

const data = [
  
    "Pref":"Freedom",
    "ID":"5545"
  ,
  
    "Pref":"Growth",
    "ID":"8946545"
  
]

首先我们需要找到您要更改的元素(使用[0] 仅选择第一个,以防有多个 ID 为 5545 的项目:

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

然后改变它!

objectToChange['Pref'] = "Liberty"

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

console.log(data)

//  [
//    ID: "5545",
//    Pref: "Liberty"
//  ,
//    ID: "8946545",
//    Pref: "Growth"
//  ]

【讨论】:

【参考方案3】:

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');

【讨论】:

以上是关于如何使用 Node Js 中的文件系统重写文件中的 JSON 对象的主要内容,如果未能解决你的问题,请参考以下文章

异步文件 IO 方法如何处理 Node.js 中的本地文件?

如何从 Node.js 中的 URL 请求

使用 Node.js 将文件系统中的目录结构转换为 JSON

如何使用node.js更改同一文件夹中的所有文件和文件夹权限

Node.js:计算文件中的行数

如何将文件逐行读入node.js中的数组[重复]