Запис об’єкта JSON у файл JSON за допомогою fs.writeFileSync


116

Я намагаюся записати об'єкт JSON у файл JSON. Код виконується без помилок, але замість вмісту об'єкта було записано, все, що записується у файл JSON:

[object Object]

Це код, який насправді пише:

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

'output' - об'єкт JSON, а файл вже існує. Будь ласка, повідомте мене, якщо потрібна додаткова інформація.


11
fs.writeFileSync ('../ data / фразаFreqs.json', JSON.stringify (output))
Даніель,

Відповіді:


169

Потрібно об'єктивувати об'єкт.

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

2
Ласкаво просимо до SO, перш ніж відповісти на запитання, спробуйте переглянути існуючу відповідь. Якщо ваша відповідь вже запропонована, замініть її. Гарну відповідь див. У посібнику громади .
LightBender

44
Мені подобається, що це відповідає на питання без думок про те, чи потрібно використовувати синхронні операції проти асинхрони чи ні.
Брайан Данкан

1
Для читання можна використовувати параметр простору методу JSON.stringify: fs.writeFileSync('../data/phraseFreqs.json', JSON.stringify(output, null, 2));Детальніше: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Binh

48

Я не думаю, що вам слід використовувати синхронний підхід, оскільки асинхронно записувати дані у файл, також краще впорядкувати, outputякщо це object.

Примітка: Якщо outputце рядок, то вкажіть кодування і запам’ятайте також flagваріанти:

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

Додано синхронний метод запису даних у файл, але, будь ласка, врахуйте ваш випадок використання. Асинхронний проти синхронного виконання, що це насправді означає?

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

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

9
Якщо це робиться за коротким сценарієм чи що-небудь, синхронно добре. Якщо це частина запиту сервера чи щось таке, воно повинно бути асинхронним.
Хілтон Шумвей

1
Не обов’язково процеси, пов'язані введенням-виведеннями, повинні бути асинхронними, але залежно від короткої складності сценарію ви можете вибрати синхронні.
акінджіде

4
Це не відповідь на запитання.
Стефан Біцзіттер

6
Користувач спеціально попросив синхронний метод
Ентоні

7
Будь ласка, перестаньте говорити про асинхронізацію добре. І має на увазі погану синхронізацію. Якщо ви переживаєте за швидкість, ваш веб-пакет повинен зробити цю оптимізацію для вас. Ви не оптимізатор. Причина: написання файлу синхронізації потрібно для інструментів командного рядка json. Які повинні закрити будь-які файли, які вони відкрили, перш ніж передавати дані наступному додатку в ланцюзі.
TamusJRoyce

27

Зробіть json людиною читаною, передавши третій аргумент stringify:

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

1

Під час надсилання даних на веб-сервер дані повинні бути рядковими ( тут ). Ви можете перетворити об’єкт JavaScript у рядок із JSON.stringify(). Ось робочий приклад:

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

Сподіваюся, це може допомогти.


1

Ось варіант з використанням версії, fsяка використовує обіцянки:

const fs = require('fs');

await fs.promises.writeFile('../data/phraseFreqs.json', JSON.stringify(output)); // UTF-8 is default
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.