2016-04-26 163 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));