Как мне красиво распечатать JSON с помощью node.js?

436

Это кажется решенной проблемой, но я не могу найти решение для нее.

По сути, я читаю файл JSON, меняю ключ и записываю новый JSON в тот же файл. Все работает, но я теряю форматирование JSON. Так, вместо:

{
  name:'test',
  version:'1.0'
}

я получил

{name:'test',version:'1.1'}

Есть ли способ в Node.js написать хорошо отформатированный JSON в файл?

Раджу
источник
JSON.stringifyзадыхается от циклических объектов и util.inspectне производит допустимый JSON. : \ Я не нашел [нативного] решения для красивой печати JSON в NodeJS
ThorSummoner
@ThorSummoner: это проблема с JSON, а не с Node - JSON изначально не поддерживает циклические ссылки. Здесь есть решение , в другом вопросе .
Саша Чедыгов

Ответы:

816

JSON.stringifyТретий параметр определяет вставку пробела для симпатичной печати. Это может быть строка или число (количество пробелов). Узел может писать в вашу файловую систему с помощью fs. Пример:

var fs = require('fs');

fs.writeFile('test.json', JSON.stringify({ a:1, b:2, c:3 }, null, 4));
/* test.json:
{
     "a": 1,
     "b": 2,
     "c": 3,
}
*/

См. Документацию JSON.stringify () в MDN , документация Node fs.

Рикардо Томази
источник
1
Примечание: вместо 4 используйте, "\t"если вы хотите вкладки.
Джереми Тилле
В последних nodejs вы должны предоставить функцию обратного вызова в качестве третьего параметра, см. Этот ответ: stackoverflow.com/a/11677276/675065
Alp
216

Я думаю, что это может быть полезно ... Я люблю пример кода :)

var fs = require('fs');

var myData = {
  name:'test',
  version:'1.0'
}

var outputFilename = '/tmp/my.json';

fs.writeFile(outputFilename, JSON.stringify(myData, null, 4), function(err) {
    if(err) {
      console.log(err);
    } else {
      console.log("JSON saved to " + outputFilename);
    }
}); 
nym
источник
4
Убедитесь, что tmpпапка существует, иначе это может произойти сбой.
Ларри
2
в большинстве систем Unix (включая Mac и Linux ... и, если я вспоминаю BSD), tmpпапка существует по умолчанию
Antony
какое местоположение (имя выходного файла) нужно
указать
Я не знаю, почему мой файл не был записан (просто открыт пустым) без обратного вызова ... Или, может быть, это асинхронный, и он не работал, потому что у меня возникло исключение при запуске приложения?
Томаш Гандор
1
Спасибо, это мне очень помогло.
Сурадж Джейн
83

Если вы хотите просто напечатать объект, а не экспортировать его как действительный JSON, вы можете использовать console.dir().

Он использует подсветку синтаксиса, умные отступы, удаляет кавычки из ключей и просто делает вывод настолько красивым, насколько это возможно.

const jsonString = `{"name":"John","color":"green",
                     "smoker":false,"id":7,"city":"Berlin"}`
const object = JSON.parse(jsonString)

console.dir(object, {depth: null, colors: true})

Снимок экрана зарегистрированного объекта

Под капотом это ярлык для console.log(util.inspect(…)). Единственное отличие состоит в том, что он обходит любую пользовательскую inspect()функцию, определенную для объекта.

adius
источник
8
console.dir не создает допустимый JSON.
Грегг Линд
1
@GreggLind Уточнил это в ответе!
августа
Это заставило мой экспресс-сервер зависнуть. Я не знаю почему :(
Санкет Берде
34

Если вы не хотите хранить это где-либо, а просто просматривать объект в целях отладки.

console.log(JSON.stringify(object, null, "  "));

Вы можете изменить третий параметр, чтобы настроить отступ.

Санкет Берде
источник
1
Я искал это решение - как навсегда! Последний параметр работает как шарм!
vt2424253
11

что насчет этого?

console.table(object)

образец

Пануват Кульчаратиотин
источник