Viết / thêm dữ liệu trong tệp JSON bằng Node.js


196

Tôi đang cố gắng viết tệp JSON bằng cách sử dụng nút từ dữ liệu vòng lặp, ví dụ:

let jsonFile = require('jsonfile');

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

outPut trong loop.json là:

id :1 square : 1

nhưng tôi muốn tệp đầu ra như thế này (bên dưới) và nếu tôi chạy lại mã đó thì nên thêm đầu ra mới đó dưới dạng các phần tử trong cùng một tệp JSON hiện có:

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

Tôi muốn sử dụng cùng một tệp mà tôi đã tạo lần đầu tiên nhưng bất cứ khi nào tôi chạy mã đó, các phần tử mới sẽ thêm vào cùng một tệp đó

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

Câu trả lời:


386

Nếu tệp json này sẽ không trở nên quá lớn theo thời gian bạn nên thử:

  1. Tạo một đối tượng javascript với mảng bảng trong đó

    var obj = {
       table: []
    };
  2. Thêm một số dữ liệu vào nó như

    obj.table.push({id: 1, square:2});
  3. Chuyển đổi nó từ một đối tượng thành chuỗi với chuỗi

    var json = JSON.stringify(obj);
  4. sử dụng fs để ghi tập tin vào đĩa

    var fs = require('fs');
    fs.writeFile('myjsonfile.json', json, 'utf8', callback);
  5. nếu bạn muốn nối nó, hãy đọc tệp json và chuyển nó trở lại một đối tượng

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

Điều này sẽ làm việc cho dữ liệu lớn tối đa 100 MB một cách hiệu quả. Quá giới hạn này, bạn nên sử dụng một công cụ cơ sở dữ liệu.

CẬP NHẬT:

Tạo một hàm trả về ngày hiện tại (năm + tháng + ngày) dưới dạng chuỗi. Tạo tập tin có tên chuỗi này + .json. mô-đun fs có một chức năng có thể kiểm tra sự tồn tại của tệp có tên fs.stat (đường dẫn, gọi lại). Với điều này, bạn có thể kiểm tra nếu tập tin tồn tại. Nếu nó tồn tại, sử dụng chức năng đọc nếu không, sử dụng chức năng tạo. Sử dụng chuỗi ngày làm đường dẫn vì tệp sẽ được đặt tên là ngày hôm nay + .json. cuộc gọi lại sẽ chứa một đối tượng thống kê sẽ là null nếu tập tin không tồn tại.


1
cảm ơn vì đã trả lời tôi đã thử nó nhưng làm thế nào để kiểm tra xem có tồn tại tệp cũ hay không, sau đó chạy mã readlfile khác chạy writeFile direct Tôi đang tạo tệp mới hàng ngày với tên hiện tại trong tên tệp và tôi muốn thêm dữ liệu mới vào tệp cũ đó cả ngày khi mã này chạy
Isoftmaster

1
cảm ơn bạn một lần nữa tôi đã làm cho mã của mình hoạt động: D với tất cả sự hỗ trợ của bạn nhưng tôi đã sử dụng chức năng fs.exists câu hỏi của tôi được cập nhật với câu trả lời
Isoftmaster

Hoặc bạn cũng có thể sử dụng gói Node jsonfile bao gồm tất cả các phức tạp không được hiển thị trong mã ở trên.
Jeach

Nếu "bảng" hoặc thuộc tính của đối tượng JSON không được biết trước thì sao?
oldboy

@kailniris thưa ông, làm thế nào tôi có thể cập nhật một nút cụ thể trong tệp json cục bộ của tôi trong js.ie góc. Tôi có một tệp config.json tôi muốn cập nhật một nút cụ thể của nó sau đó làm thế nào tôi có thể làm điều đó.
cháy

23

Hãy thử chương trình sau đây. Bạn có thể mong đợi đầu ra này.

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

Lưu chương trình này trong một tệp javascript, giả sử, vuông.js.

Sau đó chạy chương trình từ dấu nhắc lệnh bằng lệnh node square.js

Những gì nó làm là, chỉ đơn giản là ghi đè tệp hiện có với bộ dữ liệu mới, mỗi khi bạn thực hiện lệnh.

Chúc mừng mã hóa.


11

bạn nên đọc tệp, mỗi khi bạn muốn thêm thuộc tính mới vào json, sau đó thêm thuộc tính mới

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
cảm ơn vì đã trả lời tôi đã thử nó nhưng làm thế nào để kiểm tra xem có tồn tại tệp cũ hay không, sau đó chạy mã readlfile khác chạy writeFile direct để tạo tệp mới. Tôi đang tạo tệp mới hàng ngày với tên tệp hiện tại và tôi muốn thêm dữ liệu mới vào đó tập tin cũ cả ngày khi mã này chạy
Isoftmaster

10

Ví dụ trên cũng đúng, nhưng tôi cung cấp ví dụ đơn giản:

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

thử

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

Để định dạng jsonfile cung cấp spacestùy chọn mà bạn có thể truyền dưới dạng tham số:

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

Hoặc sử dụng jsonfile.spaces = 4. Đọc chi tiết tại đây .

Tôi sẽ không đề xuất ghi vào tệp mỗi lần trong vòng lặp, thay vào đó xây dựng đối tượng JSON trong vòng lặp và ghi vào tệp bên ngoài vòng lặp.

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

7

Đối với cách tiếp cận đồng bộ

const fs = require('fs')
fs.writeFileSync('file.json', JSON.stringify(jsonVariable));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.