I need to add a song to a .json file. The json is an object, with inside objects.
{
"Song title 1": {
"title": "Song title 1",
"author": "Song author 1",
"date": "1894"
},
"Song title 2": {
"title": "Song title 2",
"author": "Song author 2",
"date": "2000"
},
"title": {
"title": "yyyy",
"author": "",
"date": "ggggg"
}
}
In the json above was added by running the function saveSongs("yyyy", "", "ggggg")
export const saveSongs = async (title, author, date) => {
const songs = JSON.parse(await fs.readFileSync(
'songs.json', 'utf-8'
));
const newSong = {
title: {
"title": title,
"author": author,
"date": date
}
}
const updatedBookList = Object.assign(song, newSong)
console.log(updatedSongList);
fs.writeFileSync("songs.json", JSON.stringify(updatedSongList))
};
The problem is that the key of the object needs to be the same as the title. So instead of
"title": {
"title": "yyyy",
"author": "",
"date": "ggggg"
}
it should save
"yyyy": {
"title": "yyyy",
"author": "",
"date": "ggggg"
}
In order to fix that it originall was as a string:
const newSong = {
"title": {
"title": title,
"author": author,
"date": date
}
}
so I removed the string quotes... but stil the same.
How can I fix that?
To dynamically set the title value as the key, use the [title]: ... notation:
const newSong = {
[title]: {
"title": title,
"author": author,
"date": date
}
}
Also, do not use await fs.readFileSync because readFileSync returns the value. Instead, use await fs.promises.readFile which uses promises:
export const saveSongs = async (title, author, date) => {
const songs = JSON.parse(await fs.promises.readFile(
'songs.json', 'utf-8'
));
const newSong = {
[title]: {
"title": title,
"author": author,
"date": date
}
}
const updatedBookList = Object.assign(song, newSong)
console.log(updatedSongList);
await fs.promises.writeFile("songs.json", JSON.stringify(updatedSongList))
};
Use the following code :
const newSong = { [title]: { "title": title, "author": author, "date": date } }