เขียน / เพิ่มข้อมูลในไฟล์ JSON โดยใช้ Node.js


199

ฉันพยายามเขียนไฟล์ JSON โดยใช้โหนดจากข้อมูลลูปเช่น:

let jsonFile = require('jsonfile');

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

outPut in loop.json คือ:

id :1 square : 1

แต่ฉันต้องการไฟล์เอาต์พุตเช่นนี้ (ด้านล่าง) และถ้าฉันเรียกใช้โค้ดนั้นอีกครั้งมันควรจะเพิ่มเอาต์พุตใหม่เป็นองค์ประกอบในไฟล์ 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
      }
   ]
}

ฉันต้องการใช้ไฟล์เดียวกันกับที่ฉันสร้างครั้งที่ 1 แต่เมื่อใดก็ตามที่ฉันเรียกใช้องค์ประกอบใหม่ของรหัสนั้นควรเพิ่มในไฟล์เดียวกัน

const fs = require('fs');

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

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

        let json = JSON.stringify(obj);
        fs.writeFile('myjsonfile.json', json);
    }
});

คำตอบ:


388

หากไฟล์ json นี้จะไม่ใหญ่เกินไปในเวลาที่คุณควรลอง:

  1. สร้างวัตถุจาวาสคริปต์ที่มีอาร์เรย์ตารางในนั้น

    var obj = {
       table: []
    };
  2. เพิ่มข้อมูลลงไปเช่น

    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 (เส้นทาง, การเรียกกลับ) ด้วยวิธีนี้คุณสามารถตรวจสอบว่ามีไฟล์อยู่หรือไม่ หากมีอยู่ให้ใช้ฟังก์ชั่นการอ่านหากไม่มีให้ใช้ฟังก์ชันสร้าง ใช้สตริงวันที่เป็นเส้นทาง cuz ไฟล์จะถูกตั้งชื่อเป็น today date + .json การเรียกกลับจะมีวัตถุสถิติซึ่งจะเป็นโมฆะหากไฟล์ไม่อยู่


1
ขอบคุณสำหรับการตอบกลับฉันลองใช้งานได้ แต่วิธีตรวจสอบว่ามีไฟล์เก่าอยู่หรือไม่แล้วรันโค้ด readlfile อื่นรัน writeFile โดยตรงฉันกำลังสร้างไฟล์ใหม่ทุกวันด้วยวันที่ปัจจุบันในชื่อไฟล์และฉันต้องการข้อมูลใหม่ที่จะเพิ่มในไฟล์เก่าทั้งวัน เมื่อรหัสนี้ทำงาน
Isoftmaster

1
ขอขอบคุณอีกครั้งที่ฉันทำรหัสของฉันทำงาน: D กับทุกการสนับสนุนของคุณ แต่ฉันใช้ fs.exists ทำงานคำถามของฉันมีการปรับปรุงด้วยคำตอบ
Isoftmaster

หรือคุณสามารถใช้แพคเกจjsonfile Node ซึ่งล้อมรอบความซับซ้อนทั้งหมดที่ไม่ได้แสดงในรหัสข้างต้น
Jeach

ถ้าไม่รู้จัก "ตาราง" หรือคุณสมบัติของวัตถุ JSON ล่วงหน้า?
oldboy

@ kailniris คุณจะอัพเดตโหนดเฉพาะในไฟล์ json ในพื้นที่ของฉันเป็น js.ie ได้อย่างไรฉันมีไฟล์ config.json ฉันต้องการอัปเดตโหนดเฉพาะของมันแล้วฉันจะทำอย่างไร
theburningfire

25

กรุณาลองโปรแกรมต่อไปนี้ คุณอาจคาดหวังผลลัพธ์นี้

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

บันทึกโปรแกรมนี้ในไฟล์จาวาสคริปต์เช่น square.js

จากนั้นเรียกใช้โปรแกรมจากพรอมต์คำสั่งโดยใช้คำสั่ง node square.js

มันคืออะไรเพียงเขียนทับไฟล์ที่มีอยู่ด้วยชุดข้อมูลใหม่ทุกครั้งที่คุณเรียกใช้คำสั่ง

Happy Coding


12

คุณควรอ่านไฟล์ทุกครั้งที่คุณต้องการเพิ่มคุณสมบัติใหม่ลงใน 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

10

ตัวอย่างข้างต้นถูกต้อง แต่ฉันให้ตัวอย่างง่ายๆ:

var fs = require("fs");
var sampleObject = {
    name: 'pankaj',
    member: 'stack',
    type: {
        x: 11,
        y: 22
    }
};

fs.writeFile("./object.json", JSON.stringify(sampleObject, null, 4), (err) => {
    if (err) {
        console.error(err);
        return;
    };
    console.log("File has been created");
});

8

ลอง

var fs = require("fs");
var sampleObject = { your data };

fs.writeFile("./object.json", JSON.stringify(sampleObject, null, 4), (err) => {
    if (err) {  console.error(err);  return; };
    console.log("File has been created");
});

7

สำหรับการจัดรูปแบบ jsonfile ให้spacesตัวเลือกที่คุณสามารถผ่านเป็นพารามิเตอร์:

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

jsonfile.spaces = 4หรือการใช้งาน อ่านรายละเอียดที่นี่

ฉันจะไม่แนะนำให้เขียนไฟล์ในแต่ละครั้งในลูปแทนการสร้างวัตถุ 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);
});

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.