Как мне красиво распечатать 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);
    }
}); 

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()функцию, определенную для объекта.


8
console.dir не создает допустимый JSON.
Грегг Линд

1
@GreggLind Уточнил это в ответе!
августа

Это заставило мой экспресс-сервер зависнуть. Я не знаю почему :(
Санкет Берде

34

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

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

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


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.