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.


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

Jawaban:


169

Anda perlu merangkai objek.

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

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

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

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.