2016-04-26 228 views
55

我试图使用节点从循环数据 例如,在loop.json写入/ JSON文件中使用的node.js

var jsonfile = require('jsonfile'); 
for (i=0; i <11 ; i++){ 
    jsonfile.writeFile('loop.json', "id :" + i + " square :" + i*i); 
} 

输出是

id :1 square : 1 

,但我写的JSON文件添加数据想要这样的输出文件(下面),如果我再次运行该代码,它应该添加新的输出作为元素在相同的现有JSON文件中

{ 
    "table": [ 
    { 
     "Id ": 1, 
     "square ": 1 
    }, 
    { 
     "Id ": 2, 
     "square ": 3 
    }, 
    { 
     "Id ": 3, 
     "square ": 9 
    }, 
    { 
     "Id ": 4, 
     "square ": 16 
    }, 
    { 
     "Id ": 5, 
     "square ": 25 
    }, 
    { 
     "Id ": 6, 
     "square ": 36 
    }, 
    { 
     "Id ": 7, 
     "square ": 49 
    }, 
    { 
     "Id ": 8, 
     "square ": 64 
    }, 
    { 
     "Id ": 9, 
     "square ": 81 
    }, 
    { 
     "Id ": 10, 
     "square ": 100 
    } 
    ] 
} 

我想用我创建的第一个时间同一个文件,但每当我运行代码的新元素应该添加在同一文件

var fs = require('fs'); 

var obj = { 
    table: [] 
}; 

fs.exists('myjsonfile.json', function(exists){ 
    if(exists){ 
     console.log("yes file exists"); 
     fs.readFile('myjsonfile.json', function readFileCallback(err, data){ 
     if (err){ 
      console.log(err); 
     } else { 
     obj = JSON.parse(data); 
     for (i=0; i<5 ; i++){ 
     obj.table.push({id: i, square:i*i}); 
     } 
     var json = JSON.stringify(obj); 
     fs.writeFile('myjsonfile.json', json); 
     }}); 
    } else { 
     console.log("file not exists") 
     for (i=0; i<5 ; i++){ 
     obj.table.push({id: i, square:i*i}); 
     } 
     var json = JSON.stringify(obj); 
     fs.writeFile('myjsonfile.json', json); 
     } 
    }); 

回答

118

如果这个JSON文件不会成为在该时间过大,你应该尝试:

  1. var obj = { 
        table: [] 
    }; 
    
  2. 创建一个表数组JavaScript对象添加一些数据它就像

    obj.table.push({id: 1, square:2}); 
    
  3. 将它从一个对象转换为stringify字符串

    var json = JSON.stringify(obj); 
    
  4. 使用FS将文件写入到磁盘

    var fs = require('fs'); 
    fs.writeFile('myjsonfile.json', json, 'utf8', callback); 
    
  5. ,如果你想将其追加读取JSON文件,并将其转换回对象

    fs.readFile('myjsonfile.json', 'utf8', function readFileCallback(err, data){ 
        if (err){ 
         console.log(err); 
        } else { 
        obj = JSON.parse(data); //now it an object 
        obj.table.push({id: 2, square:3}); //add some data 
        json = JSON.stringify(obj); //convert it back to json 
        fs.writeFile('myjsonfile.json', json, 'utf8', callback); // write it back 
    }}); 
    

这对于最大100 MB的数据有效。超过此限制,您应该使用数据库引擎。

UPDATE:

创建其中返回当前的日期(年+月+日)为一个字符串的函数。创建名为该字符串+ .json的文件。fs模块有一个可以检查名为fs.stat(path,callback)的文件存在的函数。 有了这个,你可以检查文件是否存在。如果存在,则使用read函数,如果它不使用create函数的话。使用日期字符串作为cuz文件将被命名为today date + .json的路径。回调将包含一个stats对象,如果该文件不存在,该对象将为null。

+1

感谢回复 我试过它的工作,但如何检查旧文件是否存在,然后运行readlfile代码 else run writeFile直接 我正在创造每日新的当前日期的文件名为 ,并且我希望在此代码运行时整天添加新数据 – Isoftmaster

+1

根据您的新问题更新我的答案 – kailniris

+1

再次感谢您 我让我的代码工作:D with all您的支持 但我用fs.exists函数 我的问题更新与答案 – Isoftmaster

4

你应该阅读文件,每次你想一个新的属性添加到json,然后添加新的属性

var fs = require('fs'); 
fs.readFile('data.json',function(err,content){ 
    if(err) throw err; 
    var parseJson = JSON.parse(content); 
    for (i=0; i <11 ; i++){ 
    parseJson.table.push({id:i, square:i*i}) 
    } 
    fs.writeFile('data.json',JSON.stringify(parseJson),function(err){ 
    if(err) throw err; 
    }) 
}) 
+1

感谢答复 我想它的工作,但如何检查旧文件的存在,然后运行readlfile代码 其他人遇到的WriteFile直接创建新的文件 我创建每天新文件当前日期在文件名 ,我希望新的数据被添加在这个旧文件,当这段代码运行 – Isoftmaster

3

请尝试以下程序。你可能会期待这个输出。

var fs = require('fs'); 

var data = {} 
data.table = [] 
for (i=0; i <26 ; i++){ 
    var obj = { 
     id: i, 
     square: i * i 
    } 
    data.table.push(obj) 
} 
fs.writeFile ("input.json", JSON.stringify(data), function(err) { 
    if (err) throw err; 
    console.log('complete'); 
    } 
); 

将此程序保存在JavaScript文件中,比如square.js。

然后从命令提示符下使用命令node square.js

它所做的是,直接覆盖有新的数据集的现有文件,每次执行命令运行程序。

快乐编码。

3

进行格式化jsonfile给spaces选项,它可以作为参数传递:

jsonfile.writeFile(file, obj, {spaces: 2}, function (err) { 
     console.error(err); 
    }) 

或者使用jsonfile.spaces = 4。阅读详情here

我不会建议每次在循环中写入文件,而是在循环中构建JSON对象并写入循环外部的文件。

var jsonfile = require('jsonfile'); 
var obj={ 
    'table':[] 
    }; 

for (i=0; i <11 ; i++){ 
     obj.table.push({"id":i,"square":i*i}); 
} 
jsonfile.writeFile('loop.json', obj, {spaces:2}, function(err){ 
     console.log(err); 
}); 
0

您还可以导入并使用此开源代码write-json-file component

例子:

const writeJsonFile = require('bit/global/write-json-file'); 
const jsonFile = "/tmp/exampleFile.json"; 
writeJsonFile(jsonFile,{isThisReal:ture,author:amit}).catch(err => console.log(err));