如何更新json文件中的值并通过node.js保存

Nav*_*nik 65 json node.js

如何更新json文件中的值并通过node.js保存?我有文件内容:

var file_content = fs.readFileSync(filename);
var content = JSON.parse(file_content);
var val1 = content.val1;
Run Code Online (Sandbox Code Playgroud)

现在我想更改值val1并将其保存到文件中.

Set*_*eth 95

异步执行此操作非常简单.如果你担心阻塞线程(可能),它会特别有用.

var fs = require('fs');
var fileName = './file.json';
var file = require(fileName);

file.key = "new value";

fs.writeFile(fileName, JSON.stringify(file), function (err) {
  if (err) return console.log(err);
  console.log(JSON.stringify(file));
  console.log('writing to ' + fileName);
});
Run Code Online (Sandbox Code Playgroud)

需要注意的是,json在一行上写入文件而不是美化.例如:

{
  "key": "value"
}
Run Code Online (Sandbox Code Playgroud)

将会...

{"key": "value"}
Run Code Online (Sandbox Code Playgroud)

要避免这种情况,只需添加这两个额外的参数即可 JSON.stringify

JSON.stringify(file, null, 2)
Run Code Online (Sandbox Code Playgroud)

null - 代表替换器功能.(在这种情况下,我们不想改变过程)

2 - 表示缩进的空格.


Pet*_*ons 40

//change the value in the in-memory object
content.val1 = 42;
//Serialize as JSON and Write it to a file
fs.writeFileSync(filename, JSON.stringify(content));
Run Code Online (Sandbox Code Playgroud)

  • async是一种并发技术.如果需要并发性,则需要异步才能使节点正常工作(而不是"更好").如果您没有并发性,则不需要异步.关键是你需要真正理解异步为你做什么以及为什么.它没有任何理由本质上"更好",你不需要记住它作为"最佳实践".如果OP正在编写命令行实用程序以更改JSON文件然后退出,则异步会使代码复杂化,因为不需要并发. (20认同)
  • 总的来说,使用异步写入会更好,因为这是Node的主要关注点.当然,如果没有看到周围的代码,就很难给出明确的答案.您不太可能真的需要同步,除非您需要绝对确定在写入完成之前不会发生任何其他事情.此外,当然,这应该有一个错误检查器,因为你永远不能确定文件写入是否会成功. (6认同)
  • 异步与同步完全取决于您在什么情况下所做的事情.如果这是在网络服务中,则需要异步.对于命令行实用程序,在大多数简单情况下,sync是适当的范例,但只是简单地说"异步更好"是不正确的.我的代码段基于上下文的OP片段.问题也不在于错误处理,如果文件写入失败,退出堆栈跟踪是合理的默认行为,因为没有太多可以从中恢复. (2认同)

sat*_*ker 5

除了上一个答案之外,为写操作添加文件路径目录

 fs.writeFile(path.join(__dirname,jsonPath), JSON.stringify(newFileData), function (err) {}
Run Code Online (Sandbox Code Playgroud)


Apo*_*hah 5

// read file and make object
let content = JSON.parse(fs.readFileSync('file.json', 'utf8'));
// edit or add property
content.expiry_date = 999999999999;
//write file
fs.writeFileSync('file.json', JSON.stringify(content));
Run Code Online (Sandbox Code Playgroud)