Запись объекта 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 (вывод))
Дэниел

Ответы:


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

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

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.