#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]
.