Добавление нового объекта в массив в файле JSON

#javascript #node.js #arrays #json

#javascript #node.js #массивы #json

Вопрос:

Как мне добавить дополнительный объект в существующий файл JSON, который представляет собой массив объектов?

Вот мой JS-код:

 const fs = require("fs");

let Human = { 
    Name: "John",
    age: 20,

};

Human = JSON.stringify(Human, null, 2)

fs.appendFile('users.json', Human, error);

function error(err) {
    console.log("1");
}
 

Это дает результат:

 [
    {
      "Name": "John",
      "age": 20,
    },
    
    {
      "Name": "John",
      "age": 20,
    }
]{
  "Name": "John",
  "age": 20,

}
 

Но мне нужно:

 [
    {
      "Name": "John",
      "age": 20,
    },
    
    {
      "Name": "John",
      "age": 20,
    },
    {
      "Name": "John",
      "age": 20,

    }
]
 

Как заставить его правильно записывать в массив?

Комментарии:

1. Добро пожаловать в SO! Пожалуйста, не пытайтесь обойти фильтр качества с помощью спама — на это есть причина. Проанализируйте свой файл JSON как массив JS, используйте Array#push для новой записи, затем повторно преобразуйте объект в JSON и возвращайте обратно в файл.

2. @ggorlen Ошибка типа: не удается прочитать свойство ‘push’ неопределенного

3. @ggorlen что мне нужно вставить в []?

Ответ №1:

Добавление предварительно сериализованного элемента в форме JSON к уже существующему файлу JSON имеет интуитивный смысл. Вы можете попытаться отрезать хвост "]" в файле, записать новый элемент с добавленной запятой, а затем повторно добавить "]" .

Но это может пойти не так во многих отношениях. Лучшим подходом является чтение файла, преобразование JSON в объект JS, внесение желаемых изменений в объект, сериализация объекта обратно в JSON и, наконец, запись строки обратно в файл.

Этот код показывает все эти шаги вместе с начальной записью для создания образца данных:

 const fs = require("fs").promises;

(async () => {
  // generate a sample JSON file
  const filename = "users.json";
  let users = [
    {
      name: "Amy",
      age: 21,
    },
    {
      name: "Bob",
      age: 23,
    },
  ];
  await fs.writeFile(filename, JSON.stringify(users));

  // append a new user to the JSON file
  const user = {
    name: "John",
    age: 20,
  };
  const file = await fs.readFile(filename);
  users = JSON.parse(file);
  users.push(user);
  await fs.writeFile(filename, JSON.stringify(users, null, 4));
})();
 

Комментарии:

1. вы показали, как добавить одного пользователя, могу ли я добавить двух пользователей {name:a},{name:b} в массив за один раз? Добавляется только первый пользователь.

2. users.push({name: a}, {name: b}); . Или просто вызовите .push несколько раз.

3. Первый этого не сделает, но второй с несколькими нажатиями.

4. Возможно, вы делаете что-то не так. .push() принимает несколько аргументов . a = []; a.push(1, 2, 3); console.log(a); выдает [1, 2, 3] .