Сделать это асинхронно довольно просто. Это особенно полезно, если вы беспокоитесь о блокировке потока (вероятно).
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
- представляет собой пробелы для отступа.
В дополнение к предыдущему ответу добавьте каталог пути к файлу для операции записи
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)); } }
источник
Я настоятельно рекомендую не использовать синхронные (блокирующие) функции, поскольку они выполняют другие параллельные операции . Вместо этого используйте асинхронный 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 или, в рамках асинхронных функций, оператор await .// 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!'); }); } });
источник