英文:
Adding a new key value inside a JSON file using NodeJS
问题
以下是我试图在我的JavaScript文件中执行的操作:
const file = require('../../data/files.json');
var data = {
"wolf": {"nani": "awoo"},
"loli": {"nani": "kimochi"}
}
file.push(data);
我的当前.json文件内容:
{
"cat" : {
"nani": "meow"
},
"dog": {
"nani": "woof"
}
}
这是我希望在使用NodeJS写入JSON文件后我的.json文件看起来的样子:
{
"cat" : {
"nani": "meow"
},
"dog": {
"nani": "woof"
},
"wolf": {
"nani": "awoo"
},
"loli": {
"nani": "kimochi"
}
}
这是可能的吗?如果可以的话,谢谢!
英文:
Here is what I'm trying to do in my Javascript File:
const file = require('../../data/files.json');
var data = {
"wolf": {"nani": "awoo"},
"loli": {"nani": "kimochi"}
}
file.push(data);
My current .json file contents:
{
"cat" : {
"nani": "meow"
},
"dog": {
"nani": "woof"
}
}
Here's kind of what I want my .json file to be after writing to the JSON file using NodeJS:
{
"cat" : {
"nani": "meow"
},
"dog": {
"nani": "woof"
},
"wolf": {
"nani": "awoo"
},
"loli": {
"nani": "kimochi"
}
}
Is this possible? If so thank you~!
答案1
得分: 2
当然,在运行时修改JSON是可能的。但是,您当前的方法存在三个问题。
-
file.push(data)
-.push()
是一个数组的方法,但file
不是一个数组,而是一个对象。您可以使用类似Object.assign(file, data)
的方法将data
中的所有属性分配给file
。 -
您的
data
的格式与您想要的JSON结果格式不同。例如,代替"wolf": "awoo"
,它需要是"wolf": { "nani": "awoo" }
。您可以保持当前格式,但必须转换数据以使其符合所需的结果格式。 -
以这种方式修改JSON只会修改在使用
require()
读取时存储在内存中的JSON的副本。您仍然需要保存此修改后的JSON副本。就像在文本编辑器中,您的更改只有在点击保存按钮后才会保存。要执行此操作,您可以使用fs.writeFile
和JSON.stringify
:
// 导入标准文件系统模块以读取/写入文件和文件夹
const fs = require("fs");
// 在修改数据后,使用以下方法保存更改
fs.writeFile("../../data/files.json", JSON.stringify(file), err => {
if (err) console.log(err);
});
需要使用 JSON.stringify
,因为 const file = require(...);
会将JSON转换为JavaScript对象。JSON只是文本,而JavaScript对象是一个具有原型和属性等内容的内存数据结构。JSON.stringify
将其转换回文本,以便您可以保存对象的文本版本。
与您的问题无关,但我看到您正在使用discord.js,所以这可能是为了一个discord机器人。如果您计划使用命令修改此JSON,请注意,如果您的机器人被添加到许多服务器,JSON存储将变得非常不稳定,未来可能会丢失/损坏数据。这可能会出现许多原因,但因为每次更改数据都需要对文件进行完整的重写,如果在重写过程中发生故障,它就会处于损坏状态。
我强烈建议使用适当的数据库解决方案来存储动态数据,如PostgreSQL、Redis或任何其他SQL/NoSQL解决方案。
英文:
Yes, of course it's possible to modify JSON at runtime. However there are three problems with your current approach.
-
file.push(data)
-.push()
is a function on Arrays. However,file
is not an array, it is an object. You can use something likeObject.assign(file, data)
to assign all the properties fromdata
tofile
instead. -
Your
data
is in a different format than how you want your JSON result to look like. Instead of"wolf": "awoo"
it needs to be"wolf": { "nani": "awoo" }
, for example. You could keep it in the current format but you'd have to transform the data to get it in the right result format. -
Modifying the JSON this way only modifies the copy of the JSON held in memory when it's read by
require()
. You still need to save this modified copy of the JSON. Just like in a text editor where your changes aren't saved until you hit the save button. To do this you can usefs.writeFile
andJSON.stringify
://import the standard filesystem module to read/write files and folders const fs = require("fs"); //after you modify your data use this to save the changes fs.writeFile("../../data/files.json", JSON.stringify(file), err => { if(err) console.log(err); });
JSON.stringify
is needed because const file = require(...);
will convert the JSON to a JavaScript object. JSON is just text, a JS object is an in-memory data structure that has a prototype and properties and such things. JSON.stringify
converts it back to text so you can just save the text version of the object.
Unrelated to your question, but I see you're using discord.js, so this is probably for a discord bot. If you plan on modifying this JSON with a command, be wary that if your bot gets added to many servers, JSON storage gets very unstable and is likely in the future to lose/corrupt the data. This can happen for many reasons, but it's because every time you change the data it requires a full rewrite of the file, and if the process fails during the rewrite it is left in a corrupted state.
I strongly recommend using a proper database solution to store dynamic data, like postgres, redis, or any other SQL/NoSQL solution.
答案2
得分: 1
你可以尝试像这样操作
let file = require('../../data/files.json');
console.log(file);
// 要在任何对象中添加键值对,请像这样使用:-
// object['key'] = 'value'
file['wolf'] = {
"nani": "awoo"
}
file['loli'] = {
"nani": "kimochi"
}
console.log(file);
英文:
You can try like this
let file = require('../../data/files.json');
console.log(file);
// to add key value pair in any Object use like this :-
// object['key'] = 'value'
file['wolf'] = {
"nani": "awoo"
}
file['loli'] = {
"nani": "kimochi"
}
console.log(file);
答案3
得分: 0
你需要读取文件的内容,添加你的更改,然后再次写入文件。
你所做的会导致这样的结果:
{
"cat": {
"nani": "meow"
},
"dog": {
"nani": "woof"
}
}
{
"wolf": {
"nani": "awoo"
},
"loli": {
"nani": "kimochi"
}
}
你不能简单地追加到 JSON,你需要修改它。要修改它,你需要解析它。
英文:
You would have to read in the content of the file, add your changes and write out the file again.
What you did would result in this:
{
"cat" : {
"nani": "meow"
},
"dog": {
"nani": "woof"
}
}
{
"wolf": {
"nani": "awoo"
},
"loli": {
"nani": "kimochi"
}
}
You can't just append to JSON, you need to modify it. And to modify it you need to parse it.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论