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

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

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

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

195996 次浏览
//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));

异步执行此操作非常容易。如果您关心阻塞线程(可能) ,那么它特别有用。否则,我建议 Peter Lyon 的回答

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"}

To avoid this, simply add these two extra arguments to JSON.stringify

JSON.stringify(file, null, 2)

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

表示要缩进的空格。

为写操作添加文件路径目录

 fs.writeFile(path.join(__dirname,jsonPath), JSON.stringify(newFileData), function (err) {}
// 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));

对于那些希望向 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));
}
}

我强烈建议不要像 它们同时进行其他操作那样使用同步(阻塞)函数,而是使用异步 我保证:

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返回一个挂起的承诺,您将需要使用 。然后功能或者在异步函数中使用 等待接线员

// 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

任务完成后保存数据

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

基于承诺的解决方案[ Javascript (ES6) + Node.js (V10或以上)]

const fsPromises = require('fs').promises;
fsPromises.readFile('myFile.json', 'utf8')
.then(data => {
let json = JSON.parse(data);
//// Here - update your json as per your requirement ////


fsPromises.writeFile('myFile.json', JSON.stringify(json))
.then(  () => { console.log('Update Success'); })
.catch(err => { console.log("Update Failed: " + err);});
})
.catch(err => { console.log("Read Error: " +err);});

如果您的项目支持 Javascript ES8,那么您可以使用 阿西恩/等待代替本机承诺。