Menulis objek JSON ke file JSON dengan fs.writeFileSync

116

Saya mencoba menulis objek JSON ke file JSON. Kode dijalankan tanpa kesalahan, tetapi alih-alih konten objek ditulis, semua yang ditulis ke dalam file JSON adalah:

[object Object]

Ini adalah kode yang sebenarnya menulis:

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

'output' adalah objek JSON, dan file tersebut sudah ada. Tolong beritahu saya jika informasi lebih lanjut diperlukan.

Romulus3799
sumber
11
fs.writeFileSync ('../ data / phraseFreqs.json', JSON.stringify (output))
Daniel
Kemungkinan duplikat objek Tulis ke dalam file dengan Node.js
Neeraj Sewani

Jawaban:

169

Anda perlu merangkai objek.

fs.writeFileSync('../data/phraseFreqs.json', JSON.stringify(output));
Kamal
sumber
2
Selamat datang di SO, sebelum menjawab sebuah pertanyaan coba ulas jawaban yang sudah ada. Jika jawaban Anda telah disarankan, beri suara positif untuk jawaban itu. Lihat panduan komunitas untuk menulis jawaban yang bagus.
LightBender
44
Saya suka ini menjawab pertanyaan tanpa pendapat tentang apakah akan menggunakan operasi sinkron vs asinkron atau tidak.
Brian Duncan
1
Untuk tujuan keterbacaan, Anda dapat menggunakan parameter spasi dari metode JSON.stringify: fs.writeFileSync('../data/phraseFreqs.json', JSON.stringify(output, null, 2));Selengkapnya: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Binh
48

Saya tidak berpikir Anda harus menggunakan pendekatan sinkron, menulis data secara asinkron ke file lebih baik juga merangkai outputjika itu object.

Catatan: Jika outputadalah sebuah string, maka tentukan encodingnya dan ingat juga flagopsinya .:

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

Menambahkan metode Sinkron untuk menulis data ke file, tetapi harap pertimbangkan kasus penggunaan Anda. Eksekusi Asinkron vs Sinkron, Apa Artinya Sebenarnya?

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

fs.writeFileSync('/tmp/phraseFreqs.json', content);
akinjide
sumber
9
Jika itu dilakukan dalam skrip pendek atau semacamnya, sinkron tidak masalah. Jika itu bagian dari permintaan server atau sesuatu, maka itu harus asynchronous.
Hilton Shumway
1
Belum tentu, proses terikat I / O harus dibuat asinkron, tetapi bergantung pada kerumitan skrip singkat, Anda dapat memilih untuk sinkron.
akinjide
4
Ini bukanlah jawaban atas pertanyaan.
Stephan Bijzitter
6
Pengguna secara khusus meminta metode sinkron
Anthony
7
Tolong berhenti mengatakan async bagus. Dan menyiratkan sinkronisasi buruk. Jika Anda khawatir tentang kecepatan, webpack Anda harus melakukan pengoptimalan itu untuk Anda. Anda bukan pengoptimal. Alasan: sinkronisasi file menulis diperlukan untuk alat baris perintah json. Yang harus menutup file apa pun yang telah mereka buka sebelum menyalurkan data ke aplikasi berikutnya dalam rantai.
TamusJRoyce
27

Jadikan json manusia dapat dibaca dengan meneruskan argumen ketiga ke stringify:

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

Saat mengirim data ke server web, data harus berupa string (di sini ). Anda dapat mengubah objek JavaScript menjadi string dengan JSON.stringify(). Berikut adalah contoh yang berfungsi:

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

Semoga bisa membantu.

Reza Baradaran Gazorisangi
sumber
1

Berikut variasinya, menggunakan versi fsyang menggunakan promise:

const fs = require('fs');

await fs.promises.writeFile('../data/phraseFreqs.json', JSON.stringify(output)); // UTF-8 is default
Flimm
sumber