Javascript 用一个简单的模板创建一个包含多个对象的JSON文件
我有一个RESTAPI POST请求使用的模板JSON文件。此文件包含此对象Javascript 用一个简单的模板创建一个包含多个对象的JSON文件,javascript,json,node.js,ecmascript-6,Javascript,Json,Node.js,Ecmascript 6,我有一个RESTAPI POST请求使用的模板JSON文件。此文件包含此对象 { "Subject": "template", "Body": { "ContentType": "HTML", "Content": "template" }, "Start": { "DateTime": "2014-02-02T18:00:00", "TimeZone": "Europe/Paris" },
{
"Subject": "template",
"Body": {
"ContentType": "HTML",
"Content": "template"
},
"Start": {
"DateTime": "2014-02-02T18:00:00",
"TimeZone": "Europe/Paris"
},
"End": {
"DateTime": "2014-02-02T19:00:00",
"TimeZone": "Europe/Paris"
}
}
我编写了一个小函数来更改这个对象中的一些数据,并将其保存到另一个名为jsonOutput.json的json文件中
有更改数据的功能,运行良好
function insertDatasJson (res) {
let fs = require('fs');
let base = require('../public/json/template.json');
base.Subject = 'f';
base.Body.Content = 'e';
base.Start.DateTime = '2016-11-13T08:30:00';
base.End.DateTime = '2016-11-13T17:30:00';
fs.writeFileSync('./public/json/output/jsonOutput.json', JSON.stringify(base, null, 4));
}
现在我试图做同样的修改,但我有很多数据要修改(多个主题、多个内容和多个开始/结束日期)
我正在尝试这样的输出文件
[
{
"Subject": "1",
"Body": {
"ContentType": "HTML",
"Content": "1"
},
"Start": {
"DateTime": "2014-02-02T18:00:00",
"TimeZone": "Europe/Paris"
},
"End": {
"DateTime": "2014-02-02T19:00:00",
"TimeZone": "Europe/Paris"
}
},
// some other objects ...
{
"Subject": "n",
"Body": {
"ContentType": "HTML",
"Content": "n"
},
"Start": {
"DateTime": "2014-02-02T18:00:00",
"TimeZone": "Europe/Paris"
},
"End": {
"DateTime": "2014-02-02T19:00:00",
"TimeZone": "Europe/Paris"
}
}
]
问题是,如果我在我的小函数中做一个简单的循环,每个数据都会覆盖之前的数据,我会得到一个像模板一样的输出文件
如何在循环过程中不覆盖数据并拥有像我的示例那样的输出文件?显而易见的事实是,如果您确实要保存许多这样的对象,那么应该使用像MONGODB这样的数据库。无论如何,以下是我的解决方案:
JSON文件应该包含数组而不是对象,在函数中使用push
有些人是这样想的(没有尝试运行这个,只是得到了这个想法):
库德:
function insertDatasJson (res) {
let fs = require('fs');
let base = require('../public/json/template.json');
let base2={};
base2.Subject = 'f';
base2.Body.Content = 'e';
base2.Start.DateTime = '2016-11-13T08:30:00';
base2.End.DateTime = '2016-11-13T17:30:00';
base.push(base2 );
fs.writeFileSync('./public/json/output/jsonOutput.json', JSON.stringify(base, null, 4));
}
JSON:
我认为问题在于您正在使用fs.writeFileSync()
覆盖该文件
您应该使用fs.appendFileSync()
将新数据添加到文件末尾。请参阅节点文档
如果一次写入所有数据,则需要创建一个数组,将所有对象推送到数组,然后将数组写入文件
function insertDatasJson (res) {
let fs = require('fs');
let base = require('../public/json/template.json');
let result = [];
for (/*you loop statmeent*/) {
let obj = JSON.parse(JSON.stringify(base)); // or your preferred way of deep copying
obj.Subject = 'f';
obj.Body.Content = 'e';
obj.Start.DateTime = '2016-11-13T08:30:00';
obj.End.DateTime = '2016-11-13T17:30:00';
result.push(obj);
}
fs.writeFileSync('./public/json/output/jsonOutput.json', JSON.stringify(result, null, 4));
}
或者,如果要在多次运行中写入数据,则
function insertDatasJson (res) {
let fs = require('fs');
let base = require('../public/json/template.json');
let data = require('./public/json/output/jsonOutput.json');
base.Subject = 'f';
base.Body.Content = 'e';
base.Start.DateTime = '2016-11-13T08:30:00';
base.End.DateTime = '2016-11-13T17:30:00';
data.push(base);
fs.writeFileSync('./public/json/output/jsonOutput.json', JSON.stringify(data, null, 4));
}
然而,在第二种情况下,当输出文件中没有现有数据或文件不存在时,您需要添加一些代码来处理第一次运行的情况。处理这种情况的另一种方法是使用空JSON数组初始化输出文件
[]
编辑:在这两种情况下,附加到现有文件将不起作用,因为它将生成无效的JSON。您是否询问如何不覆盖写入的文件?是否尝试附加jsonOutput.JSON文件?这将导致无效的JSON。如果你想在一个JSON文件中包含多个对象,你需要创建一个数组,并将这些对象推送到创建的数组中。是的,我正在尝试附加jsonOutput.JSON文件请参见clurect的回答,为什么你认为应该这样做?因为你可以将任意数量的对象推送到一个数组中。这样你就可以读取文件并将新对象推送到一个重写的数组中。不,我问你为什么认为一个文件应该包含一个数组而不是附加的JSON对象?有没有人说他想要这个?更不用说您的解决方案效率很低:您必须将所有对象保留在内存中。流式传输是不可能的。@奇怪的是,JSON只能保存一个对象或一个Array@freakish我不知道他需要的是一个巨大的文件。这是一个很好的简单实用的解决方案,最多可以处理几百个对象。True对于数百万对象来说不太好,无论如何这都需要像MONGO这样的数据库
[]