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

Posted

技术标签:

【中文标题】如何更新json文件中的值并通过node.js保存【英文标题】:How to update a value in a json file and save it through node.js 【发布时间】:2012-05-27 23:56:38 【问题描述】:

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

var file_content = fs.readFileSync(filename);
var content = JSON.parse(file_content);
var val1 = content.val1;

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

【问题讨论】:

【参考方案1】:

异步执行此操作非常简单。如果您担心阻塞线程(可能),它特别有用。否则,我会建议彼得里昂的答案

const fs = require('fs');
const fileName = './file.json';
const file = require(fileName);
    
file.key = "new value";
    
fs.writeFile(fileName, JSON.stringify(file), function writeJSON(err) 
  if (err) return console.log(err);
  console.log(JSON.stringify(file));
  console.log('writing to ' + fileName);
);

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


  "key": "value"

将会……

"key": "value"

为避免这种情况,只需将这两个额外的参数添加到JSON.stringify

JSON.stringify(file, null, 2)

null - 表示替换函数。 (在这种情况下,我们不想改变流程)

2 - 表示要缩进的空格。

【讨论】:

【参考方案2】:
//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));

【讨论】:

总的来说,最好使用异步写入,因为这是 Node.js 的主要关注点。当然,如果没有看到周围的代码,很难给出明确的答案。除非您需要绝对确定在写入完成之前不会发生任何其他事情,否则您不太可能真的需要同步。此外,当然,这应该有一个错误检查器,因为您永远无法确定文件写入会成功。 异步与同步完全取决于您在什么上下文中执行的操作。如果这是在网络服务中,则需要异步。对于命令行实用程序,在大多数简单情况下,同步是合适的范例,但只是下意识地说“异步更好”是不正确的。我的 sn-p 基于上下文的 OP sn-p。问题也不在于错误处理,如果文件写入失败,退出堆栈跟踪是合理的默认行为,因为您无法从中恢复。 因为节点是基于循环的,异步几乎总是更好,所以你不会阻塞循环,这根本不是一个下意识的反应,只是节点开发的标准做法。我已经说过这取决于要求,我认为 Q 没有说明命令行?同样一般来说,如果这是一组更大的代码的一部分(OP 没有澄清),那么错误处理总是聪明的最佳实践。转储堆栈跟踪对开发人员来说是可以的,但对其他人来说是废话。 异步是一种并发技术。如果您需要并发,节点需要异步才能正常工作(不是“更好”)。如果您没有并发,则不需要异步。关键是您需要真正了解异步为您做了什么以及为什么。它本身并不是无缘无故“更好”的,您无需将其记住为“最佳实践”。如果 OP 正在编写命令行实用程序来更改 JSON 文件然后退出,则异步会无缘无故地使代码复杂化,因为不需要并发。 我正在构建一个节点命令行工具。如果未同步写入,则当我的工具的输出链接到下一个工具时,文件可能会被锁定。使用同步有很好的理由。以及使用异步的充分理由。【参考方案3】:
// 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));

【讨论】:

【参考方案4】:

在上一个答案的基础上添加写入操作的文件路径目录

 fs.writeFile(path.join(__dirname,jsonPath), JSON.stringify(newFileData), function (err) 

【讨论】:

【参考方案5】:

对于那些希望将项目添加到 json 集合的人

function save(item, path = './collection.json')
    if (!fs.existsSync(path)) 
        fs.writeFile(path, JSON.stringify([item]));
     else 
        var data = fs.readFileSync(path, 'utf8');  
        var list = (data.length) ? JSON.parse(data): [];
        if (list instanceof Array) list.push(item)
        else list = [item]  
        fs.writeFileSync(path, JSON.stringify(list));
    

【讨论】:

【参考方案6】:

我强烈建议不要使用同步(阻塞)函数,如they hold other concurrent operations。相反,使用异步fs.promises:

const fs = require('fs').promises

const setValue = (fn, value) => 
  fs.readFile(fn)
    .then(body => JSON.parse(body))
    .then(json => 
      // manipulate your data here
      json.value = value
      return json
    )
    .then(json => JSON.stringify(json))
    .then(body => fs.writeFile(fn, body))
    .catch(error => console.warn(error))

请记住,setValue 返回一个待处理的承诺,您需要使用 .then function 或在异步函数中使用 await operator。

// await operator
await setValue('temp.json', 1)           // save "value": 1
await setValue('temp.json', 2)           // then "value": 2
await setValue('temp.json', 3)           // then "value": 3

// then-sequence
setValue('temp.json', 1)                 // save "value": 1
  .then(() => setValue('temp.json', 2))  // then save "value": 2
  .then(() => setValue('temp.json', 3))  // then save "value": 3

【讨论】:

【参考方案7】:

任务完成后保存数据

fs.readFile("./sample.json", 'utf8', function readFileCallback(err, data) 
        if (err) 
          console.log(err);
         else 
          fs.writeFile("./sample.json", JSON.stringify(result), 'utf8', err => 
            if (err) throw err;
            console.log('File has been saved!');
          );
        
      );

【讨论】:

以上是关于如何更新json文件中的值并通过node.js保存的主要内容,如果未能解决你的问题,请参考以下文章

更新 QJsonArray 中的值并写回 Qt 中的 Json 文件

仅更新 JSON 对象的一个​​值并使用 React Flux 保留旧的值

如何遍历 2 个文件中的行,比较值并在满足条件时更新文件中的值?

如何通过node.js中的JSONStream模块解析一个大的、换行符分隔的JSON文件?

如何使用 node.js 访问 json 对象的子元素

如何读取 JSON 文件、更改一些值并保存它。使用 FS/Javascript [重复]