Запись объекта 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.