如何在不替换整个文件的情况下写入 JSON 文件中的数组
How to write to a array in JSON file without replacing the entire file
使用fs
模块。我正在尝试将数组附加到 json 文件。在这一点上,我试图避免使用数据库。 JSON 会做我需要做的事情还是我应该尝试不同的数据处理方式?
我尝试过的:
let homeFile_JsData = {
id: id,
title: title,
author: user
}
let homeFile_data = JSON.stringify(homeFile_JsData);
fs.writeFileSync("json/home.json", homeFile_data, "UTF-8",{'flags': 'a+'});
输出:
{"id":"2", "title":"2nd_title", "authour":"2nd_me"}
但我希望它看起来像:
"array" [
{"id":"1", "title":"1st_title", "authour":"1st_me"},
{"id":"2", "title":"2nd_title", "authour":"2nd_me"}
]
如果您只想添加一行新数据,那么 JSON 并不是真正正确的格式。它不是为增量更新而设计的,因此您通常必须读取整个 JSON,将其解析为 Javascript 对象,修改 Javascript 对象,然后转换回 JSON , 然后写入 JSON.
的整个文件
如果您只是在 JSON 末尾的数组末尾添加一个新元素,您可以(非常小心地)找到一种方法来覆盖适量的 JSON 添加到它的末尾,但这并不是真正的好方法,因为结构中的微小变化可能会破坏代码。
另一方面,对于仅添加一行新数据,CSV 文本格式可以相当容易地做到这一点,因为文件中的每一行都代表一条记录,您只需将新行数据添加到随时 fs.appendfileSync()
的文件。然后你将不得不为 CSV 数据获取一个解析器,因为 nodejs 没有内置的 CSV 解析器,但是有许多模块可以在 NPM 上执行此操作,或者你甚至可以编写自己的 CSV 不难解析.
当然,更具可扩展性的解决方案将涉及使用一个简单的数据库,该数据库允许您增量修改、添加或删除任何数据,并且数据库完全为您处理数据的磁盘存储。当然,它还提供了各种其他功能,例如查询和并发保护等...
我决定采用您的解决方案...CSV 效果很好。我确实决定在沙盒中玩一些游戏,这对我也有用:
let datares = fs.readFileSync('user-mgm/users.json');
let data = JSON.parse(datares);
var arr = data.array
const new_thing = {id: id_string, data: data_string}
arr.push(new_thing)
var new_Js = {
non_array: "HELLO WORLD",
array: arr
}
let string_js = JSON.stringify(new_Js);
fs.writeFileSync('file.json', string_js, "UTF-8",{'flags': 'a'});
}
看这个,数据库是个好主意。
使用fs
模块。我正在尝试将数组附加到 json 文件。在这一点上,我试图避免使用数据库。 JSON 会做我需要做的事情还是我应该尝试不同的数据处理方式?
我尝试过的:
let homeFile_JsData = {
id: id,
title: title,
author: user
}
let homeFile_data = JSON.stringify(homeFile_JsData);
fs.writeFileSync("json/home.json", homeFile_data, "UTF-8",{'flags': 'a+'});
输出:
{"id":"2", "title":"2nd_title", "authour":"2nd_me"}
但我希望它看起来像:
"array" [
{"id":"1", "title":"1st_title", "authour":"1st_me"},
{"id":"2", "title":"2nd_title", "authour":"2nd_me"}
]
如果您只想添加一行新数据,那么 JSON 并不是真正正确的格式。它不是为增量更新而设计的,因此您通常必须读取整个 JSON,将其解析为 Javascript 对象,修改 Javascript 对象,然后转换回 JSON , 然后写入 JSON.
的整个文件如果您只是在 JSON 末尾的数组末尾添加一个新元素,您可以(非常小心地)找到一种方法来覆盖适量的 JSON 添加到它的末尾,但这并不是真正的好方法,因为结构中的微小变化可能会破坏代码。
另一方面,对于仅添加一行新数据,CSV 文本格式可以相当容易地做到这一点,因为文件中的每一行都代表一条记录,您只需将新行数据添加到随时 fs.appendfileSync()
的文件。然后你将不得不为 CSV 数据获取一个解析器,因为 nodejs 没有内置的 CSV 解析器,但是有许多模块可以在 NPM 上执行此操作,或者你甚至可以编写自己的 CSV 不难解析.
当然,更具可扩展性的解决方案将涉及使用一个简单的数据库,该数据库允许您增量修改、添加或删除任何数据,并且数据库完全为您处理数据的磁盘存储。当然,它还提供了各种其他功能,例如查询和并发保护等...
我决定采用您的解决方案...CSV 效果很好。我确实决定在沙盒中玩一些游戏,这对我也有用:
let datares = fs.readFileSync('user-mgm/users.json');
let data = JSON.parse(datares);
var arr = data.array
const new_thing = {id: id_string, data: data_string}
arr.push(new_thing)
var new_Js = {
non_array: "HELLO WORLD",
array: arr
}
let string_js = JSON.stringify(new_Js);
fs.writeFileSync('file.json', string_js, "UTF-8",{'flags': 'a'});
}
看这个,数据库是个好主意。