Ghi đối tượng JSON vào tệp JSON với fs.writeFileSync


116

Tôi đang cố gắng ghi một đối tượng JSON vào một tệp JSON. Mã thực thi mà không có lỗi, nhưng thay vì nội dung của đối tượng được ghi, tất cả những gì được ghi vào tệp JSON là:

[object Object]

Đây là đoạn mã thực sự viết:

fs.writeFileSync('../data/phraseFreqs.json', output)

'output' là một đối tượng JSON và tệp đã tồn tại. Vui lòng cho tôi biết nếu cần thêm thông tin.


11
fs.writeFileSync ('../ data / clusterFreqs.json', JSON.stringify (output))
Daniel

Câu trả lời:


169

Bạn cần phải xâu chuỗi đối tượng.

fs.writeFileSync('../data/phraseFreqs.json', JSON.stringify(output));

2
Chào mừng bạn đến với SO, trước khi trả lời một câu hỏi, hãy thử xem lại câu trả lời hiện có. Nếu câu trả lời của bạn đã được đề xuất, thay vào đó hãy tán thành câu trả lời đó. Xem hướng dẫn cộng đồng để viết một câu trả lời hay.
LightBender 22/09/17

44
Tôi thích rằng điều này trả lời câu hỏi mà không có ý kiến ​​về việc có nên sử dụng hoạt động đồng bộ so với không đồng bộ hay không.
Brian Duncan,

1
Đối với mục đích dễ đọc, bạn có thể sử dụng tham số không gian của phương pháp JSON.stringify: fs.writeFileSync('../data/phraseFreqs.json', JSON.stringify(output, null, 2));thêm: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
Bình

48

Tôi không nghĩ rằng bạn nên sử dụng phương pháp tiếp cận đồng bộ, việc ghi dữ liệu vào tệp một cách không đồng bộ sẽ tốt hơn cũng nên xâu chuỗi outputnếu đó là một object.

Lưu ý: Nếu outputlà một chuỗi, hãy chỉ định mã hóa và nhớ các flagtùy chọn:

const fs = require('fs');
const content = JSON.stringify(output);

fs.writeFile('/tmp/phraseFreqs.json', content, 'utf8', function (err) {
    if (err) {
        return console.log(err);
    }

    console.log("The file was saved!");
}); 

Đã thêm phương pháp ghi dữ liệu đồng bộ vào tệp, nhưng vui lòng xem xét trường hợp sử dụng của bạn. Thực thi không đồng bộ và đồng bộ, nó thực sự có nghĩa là gì?

const fs = require('fs');
const content = JSON.stringify(output);

fs.writeFileSync('/tmp/phraseFreqs.json', content);

9
Nếu nó được thực hiện trong một kịch bản ngắn hoặc một cái gì đó, đồng bộ là tốt. Nếu đó là một phần của yêu cầu máy chủ hoặc thứ gì đó, thì nó phải là không đồng bộ.
Hilton Shumway

1
Không nhất thiết, các quy trình ràng buộc I / O phải được thực hiện không đồng bộ, nhưng tùy thuộc vào độ phức tạp ngắn của tập lệnh mà bạn có thể chọn tham gia đồng bộ.
akinjide 23/02/18

4
Đây không phải là một câu trả lời cho câu hỏi.
Stephan Bijzitter

6
Người dùng đã yêu cầu cụ thể phương pháp đồng bộ
Anthony

7
Vui lòng ngừng nói không đồng bộ tốt. Và ngụ ý đồng bộ hóa không tốt. Nếu bạn lo lắng về tốc độ, webpack sẽ thực hiện việc tối ưu hóa đó cho bạn. Bạn không phải là người tối ưu hóa. Lý do: việc ghi tệp đồng bộ là cần thiết cho các công cụ dòng lệnh json. Thao tác này phải đóng bất kỳ tệp nào mà chúng đã mở trước khi chuyển dữ liệu đến ứng dụng tiếp theo trong chuỗi.
TamusJRoyce

27

Làm cho json con người có thể đọc được bằng cách chuyển đối số thứ ba tới stringify:

fs.writeFileSync('../data/phraseFreqs.json', JSON.stringify(output, null, 4));

1

Khi gửi dữ liệu đến máy chủ web, dữ liệu phải là một chuỗi ( ở đây ). Bạn có thể chuyển đổi một đối tượng JavaScript thành một chuỗi vớiJSON.stringify() . Đây là một ví dụ hoạt động:

var fs = require('fs');

var originalNote = {
  title: 'Meeting',
  description: 'Meeting John Doe at 10:30 am'
};

var originalNoteString = JSON.stringify(originalNote);

fs.writeFileSync('notes.json', originalNoteString);

var noteString = fs.readFileSync('notes.json');

var note = JSON.parse(noteString);

console.log(`TITLE: ${note.title} DESCRIPTION: ${note.description}`);

Hy vọng nó có thể giúp.


1

Đây là một biến thể, sử dụng phiên bản của fsnó sử dụng các hứa hẹn:

const fs = require('fs');

await fs.promises.writeFile('../data/phraseFreqs.json', JSON.stringify(output)); // UTF-8 is default
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.