Zapisywanie obiektu JSON do pliku JSON za pomocą fs.writeFileSync

116

Próbuję napisać obiekt JSON do pliku JSON. Kod jest wykonywany bez błędów, ale zamiast zapisania treści obiektu, do pliku JSON zostaje zapisany tylko:

[object Object]

Oto kod, który faktycznie pisze:

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

„Wyjście” to obiekt JSON, a plik już istnieje. Daj mi znać, jeśli potrzebujesz więcej informacji.

Romulus3799
źródło
11
fs.writeFileSync ('../ data / frazaFreqs.json', JSON.stringify (wyjście))
Daniel,
Możliwy duplikat obiektów Zapisz do pliku za pomocą Node.js
Neeraj Sewani

Odpowiedzi:

169

Musisz zdefiniować obiekt.

fs.writeFileSync('../data/phraseFreqs.json', JSON.stringify(output));
Kamal
źródło
2
Witamy w SO, zanim odpowiesz na pytanie, spróbuj przejrzeć istniejącą odpowiedź. Jeśli Twoja odpowiedź została już zasugerowana, zamiast tego zagłosuj na nią. Zobacz przewodnik dla społeczności, aby napisać dobrą odpowiedź.
LightBender
44
Podoba mi się, że to odpowiada na pytanie bez opinii o tym, czy używać operacji synchronicznych i asynchronicznych.
Brian Duncan,
1
Ze względów czytelności możesz użyć parametru spacji metody JSON.stringify: fs.writeFileSync('../data/phraseFreqs.json', JSON.stringify(output, null, 2));Więcej: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ ...
Binh
48

Nie sądzę, abyś używał podejścia synchronicznego, asynchroniczne zapisywanie danych do pliku jest lepsze również w outputprzypadku, gdy jest to plik object.

Uwaga: jeśli outputjest ciągiem, określ kodowanie i zapamiętaj również flagopcje .:

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

Dodano synchroniczną metodę zapisu danych do pliku, ale prosimy o rozważenie swojego przypadku użycia. Co tak naprawdę oznacza wykonywanie asynchroniczne i synchroniczne?

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

fs.writeFileSync('/tmp/phraseFreqs.json', content);
akinjide
źródło
9
Jeśli jest to zrobione w krótkim skrypcie lub czymś podobnym, synchronizacja jest w porządku. Jeśli jest to część żądania serwera lub coś w tym stylu, powinno być asynchroniczne.
Hilton Shumway
1
Niekoniecznie, procesy powiązane we / wy powinny być asynchroniczne, ale w zależności od złożoności krótkich skryptów można zdecydować się na synchroniczne.
akinjide
4
To nie jest odpowiedź na pytanie.
Stephan Bijzitter
6
Użytkownik specjalnie poprosił o metodę synchroniczną
Anthony
7
Przestań mówić asynchroniczna dobra. I sugeruje zła synchronizacja. Jeśli martwisz się o szybkość, Twój pakiet sieciowy powinien wykonać tę optymalizację za Ciebie. Nie jesteś optymalizatorem. Powód: zapisywanie pliku synchronizacji jest potrzebne w przypadku narzędzi wiersza polecenia json. Który musi zamknąć wszystkie otwarte pliki przed przesłaniem danych do następnej aplikacji w łańcuchu.
TamusJRoyce
27

Uczyń json czytelnym dla człowieka, przekazując trzeci argument do stringify:

fs.writeFileSync('../data/phraseFreqs.json', JSON.stringify(output, null, 4));
Timelot
źródło
1

Podczas wysyłania danych do serwera WWW dane muszą być ciągiem znaków ( tutaj ). Możesz przekonwertować obiekt JavaScript na ciąg za pomocą JSON.stringify(). Oto działający przykład:

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

Mam nadzieję, że to pomoże.

Reza Baradaran Gazorisangi
źródło
1

Oto odmiana fswykorzystująca obietnice:

const fs = require('fs');

await fs.promises.writeFile('../data/phraseFreqs.json', JSON.stringify(output)); // UTF-8 is default
Flimm
źródło