Запись объекта JSON в файл JSON с помощью fs.writeFileSync

116

Я пытаюсь записать объект JSON в файл JSON. Код выполняется без ошибок, но вместо написания содержимого объекта в файл JSON записывается следующее:

[object Object]

Это код, который на самом деле пишет:

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

'output' - это объект JSON, а файл уже существует. Пожалуйста, дайте мне знать, если потребуется дополнительная информация.

Romulus3799
источник
11
fs.writeFileSync ('../ data / фразаFreqs.json', JSON.stringify (вывод))
Дэниел
Возможный дубликат записи объектов в файл с помощью Node.js
Нирадж Севани

Ответы:

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/…
Бинь
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);
akinjide
источник
9
Если это делается коротким скриптом или чем-то в этом роде, синхронный - нормально. Если это часть запроса сервера или чего-то еще, тогда он должен быть асинхронным.
Hilton Shumway
1
Необязательно, процессы, связанные с вводом-выводом, должны быть асинхронными, но в зависимости от сложности короткого сценария вы можете выбрать синхронный.
akinjide
4
Это не ответ на вопрос.
Стефан Биджзиттер 06
6
Пользователь специально попросил синхронный метод
Энтони
7
Пожалуйста, перестаньте говорить, что асинхронность хороша. И подразумевая плохую синхронизацию. Если вас беспокоит скорость, ваш веб-пакет должен сделать эту оптимизацию за вас. Вы не оптимизатор. Причина: для инструментов командной строки json требуется запись файла синхронизации. Которая должна закрыть все открытые файлы, прежде чем передавать данные следующему приложению в цепочке.
TamusJRoyce 01
27

Сделайте json удобочитаемым, передав третий аргумент stringify:

fs.writeFileSync('../data/phraseFreqs.json', JSON.stringify(output, null, 4));
Timelot
источник
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
Флимм
источник