2016-10-31 2 views
0

У меня есть шаблон JSON-файла, используемый запросом POST API REST. Этот файл содержит этот объектСоздал файл 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" 
    } 
} 

я написал небольшую функцию, чтобы изменить некоторые ДАННЫЕ внутри этого объекта и сохранить это в другой файл JSon называется jsonOutput.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)); 
} 

Теперь я пытаюсь сделать те же изменения, но у меня есть много DATAS для модификации (множественного субъекта, множественной контенты и нескольких дат начала/конца)

Я пытаюсь иметь выходной файл, как это

[ 
    { 
     "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" 
     } 
    } 
] 

проблема заключается в том, если я простой цикл в моей маленькой функции, каждые данные, прежде чем переписывать один и я буду получать выходной файл как шаблон.

Как сделать, чтобы не перезаписывать данные во время цикла и иметь выходной файл, например, мой пример?

+0

Вы спрашиваете, как не перезаписывать файл, который вы выписываете? – Kyle

+0

Вы пытаетесь добавить файл jsonOutput.json? – Derek

+0

Это приведет к недействительности JSON. Если вам нужно несколько объектов в JSON-файле, вам нужно создать массив и нажать объекты в этот созданный массив. – DevDig

ответ

1

если вы пишете все данные сразу, то вам нужно сделать, создать массив, нажать все объекты массива и записать массив в файл

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)); 
} 

Однако во втором случае вам нужно добавить код, чтобы обработать случай первого запуска, когда нет существующих данных в выходном фи le, или файл не существует. Другой способ справиться с этим условием будет инициализировать выходной файл с пустой массив JSON

[] 

EDIT: В обоих случаях добавление в существующий файл не будет работать, как он будет генерировать недопустимый JSON.

1

Простая истина заключается в том, что вы должны использовать базу данных, такую ​​как MONGODB, если у вас действительно есть много этих объектов для сохранения. Во всяком случае здесь мое решение ваш путь:

вы JSON файл должен держать массив не объект, в вашей функции использования нажатием Somethink как это (не пробовал запускать это, просто получить идеи):

Куд:

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:

[]; 
+1

И почему вы верите в это? – freakish

+0

, потому что U может вытолкнуть любое количество объектов в массив. Этот способ U читает файл, нажимая новые объекты, переписывая его обратно. –

+0

Нет, я спрашиваю, почему вы считаете, что файл должен содержать массив вместо добавленных объектов JSON? Было ли ОП, что он этого хочет? Не говоря уже о том, что ваше решение очень неэффективно: вы должны хранить ** все ** объекты в памяти. Потоковая передача невозможна. – freakish