Как обновить значение в файле json и сохранить его через node.js

84

Как обновить значение в файле json и сохранить его через node.js? У меня есть содержимое файла:

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

Теперь я хочу изменить значение val1и сохранить его в файл.

Нава Полак Оник
источник

Ответы:

130

Сделать это асинхронно довольно просто. Это особенно полезно, если вы беспокоитесь о блокировке потока (вероятно).

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 - представляет собой пробелы для отступа.

Сет
источник
50
//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));
Питер Лайонс
источник
6
В целом, было бы лучше использовать асинхронную запись, поскольку это основная задача Node. Конечно, не видя окружающего кода, было бы сложно дать однозначный ответ. Маловероятно, что вам действительно понадобится синхронизация, если только вам не нужно быть абсолютно уверенным, что больше ничего не произойдет, пока запись не будет завершена. Кроме того, конечно, здесь должна быть программа проверки ошибок, так как вы НИКОГДА не можете быть уверены, что запись файла будет успешной.
Джулиан Найт
4
асинхронность или синхронизация зависит именно от того, что вы делаете в каком контексте. Если это в сетевой службе, вам понадобится async. Для служебной программы командной строки синхронизация является подходящей парадигмой в большинстве простых случаев, но просто толкование слов «асинхронность лучше» неверно. Мой фрагмент основан на фрагменте OP для контекста. Вопрос также не в обработке ошибок, и если запись в файл не удалась, выход с трассировкой стека является разумным поведением по умолчанию, потому что вы мало что можете сделать, чтобы исправить это.
Питер Лайонс,
Поскольку node основан на цикле, асинхронный режим почти всегда лучше, поэтому вы не блокируете цикл, это вовсе не реакция коленного рефлекса, просто стандартная практика для node Dev. Я уже сказал, что это зависит от требований, и я не думаю, что Q что-то говорит о командной строке? Кроме того, в целом, если это часть более крупного набора кода (не поясненного OP), то обработка ошибок всегда разумная и лучшая практика. Сброс трассировки стека - это нормально для разработчиков, но дерьмо для всех остальных.
Джулиан Найт
23
async - это метод параллелизма. Если вам нужен параллелизм, для правильной работы узла (а не «лучше») требуется асинхронный режим. Если у вас нет параллелизма, вам не нужен асинхронный режим. Дело в том, что вам нужно действительно понимать, что async делает для вас и почему. По сути, это не «лучше» без всякой причины, и вам не нужно запоминать его как «лучшую практику». Если OP пишет утилиту командной строки для изменения файла JSON, затем завершите работу, асинхронный режим усложняет код без причины, поскольку параллелизм не требуется.
Питер Лайонс
Я создаю инструмент командной строки узла. Если он не записан синхронно, файл может быть заблокирован, когда вывод моего инструмента будет привязан к следующему инструменту. Есть очень веские причины использовать синхронизацию. И веские причины использовать async.
TamusJRoyce
3

В дополнение к предыдущему ответу добавьте каталог пути к файлу для операции записи

 fs.writeFile(path.join(__dirname,jsonPath), JSON.stringify(newFileData), function (err) {}
Сатей Саркер
источник
2
// 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));
Апурва Шах
источник
0

Для тех, кто хочет добавить элемент в коллекцию 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));
    }
}
Шлепали
источник
0

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

Сохранять данные после завершения задачи

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!');
          });
        }
      });
Гаурав Могха
источник