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.


11
fs.writeFileSync ('../ data / frazaFreqs.json', JSON.stringify (wyjście))
Daniel,

Odpowiedzi:


169

Musisz zdefiniować obiekt.

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

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

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

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.


1

Oto odmiana fswykorzystująca obietnice:

const fs = require('fs');

await fs.promises.writeFile('../data/phraseFreqs.json', JSON.stringify(output)); // UTF-8 is default
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.