Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用一个简单的模板创建一个包含多个对象的JSON文件_Javascript_Json_Node.js_Ecmascript 6 - Fatal编程技术网

Javascript 用一个简单的模板创建一个包含多个对象的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" },

我有一个RESTAPI POST请求使用的模板JSON文件。此文件包含此对象

{
    "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这样的数据库
[]