Задать вопрос

Есть ли джаваскрипт для вывода JSON, происходящего с красивыми отступами и с уместными переходами на новую строку?

Обычный итог работы функции JSON.stringify() идёт сплошною строкою — как-нибудь так:

{"status":"Hub", "number":68, "title":"Lucky Carrier", "location":"Kiev", "sysop":"Pavel Gulchouck", "flags":{"IBN":[], "INA":["fido.happy.kiev.ua"], "IMI":["fnet@example.org"], "MO":[], "XA":[], "CM":[], "PING":[]}}


(Пробелы после запятых добавлены для удобства просмотра, а на самом деле и их нет.)


Это компактно, что делает итоговый JSON идеально пригодным для передачи через Сеть, например.


Зато человеку читать такой вывод будет очень сложно, особенно если данных в несколько раз больше, чем в моём примере.


Между тем иногда возникает необходимость чтения JSON в целях отладки, а иногда хочется хранить настройки в таком файле, который одинаково был бы удобен для чтения и JSON.parse(), и человеком. Поэтому интересно, есть ли такой джаваскрипт, который способен выводить JSON в красивом человекопонятном виде, с приятными (и создающими удобство чтения) переходами на новую строку и с отступами из пробелов — как-нибудь так:

{
"status":   "Hub",
"number":   68,
"title":    "Lucky Carrier",
"location": "Kiev",
"sysop":    "Pavel Gulchouck",
"flags": {
   "IBN":  [],
   "INA":  ["fido.happy.kiev.ua"],
   "IMI":  ["fnet@example.org"],
   "MO":   [],
   "XA":   [],
   "CM":   [],
   "PING": []
}
}


Желаемыми, таким образом, являются:

  • Переход на новую строку в начале объекта (после открывающей фигурной скобки), в конце объекта (перед закрывающей фигурной скобкою), между полями объекта (после запятой).

     
  • Отступы перед именами полей объектов, соответствующие уровню вложенности объектов друг в друга.

     
  • Отступы перед значениями, компенсирующие различия в длине имён их, чтобы левые края значений выстроились друг под другом.


При всём при том итог вывода всё равно должен оставаться правильным JSON.


Вот наглядный пример того, как нельзя поступать поэтому: нельзя на движке Node заменять вызов JSON.stringify() вызовом console.log(require('util').inspect()). Итог работы, конечно, будет тогда красивым:

{ status: 'Hub',
  number: 68,
  title: 'Lucky Carrier',
  location: 'Kiev',
  sysop: 'Pavel Gulchouck',
  flags:
   { IBN: [],
     INA: [ 'fido.happy.kiev.ua' ],
     IMI: [ 'fnet@example.org' ],
     MO: [],
     XA: [],
     CM: [],
     PING: [] } }


В этом выводе не начинается новая строка перед и после фигурных скобок, в нём нет и отступов перед значениями, но даже половина вышеперечисленных удобств ужé многое делает для достижения желаемой человекочитаемости.


Однако нетрудно видеть, к сожалению, что require('util').inspect() убирает кавычки, стоявшие вокруг имён полей объекта — а кавычки вокруг значений заменяет на одинарные (апострофы) вместо двойных (подобных знаку дюйма).


А значит, в итоге получается ужé не JSON.


И это печально.


Спрашиваю поэтому: есть ли средство лучше этого? Есть ли какой-нибудь джаваскрипт с открытым исходным кодом, пригодный для вывода JSON, совершающегося с красивыми отступами и с уместными переходами на новую строку, однако при этом нигде не нарушающего правила JSON?
  • Вопрос задан
  • 6395 просмотров
Подписаться 4 Оценить Комментировать
Решения вопроса 1
Mithgol
@Mithgol Автор вопроса
А, всё, я сам нашёл ответ.

У функции JSON.stringify() есть необязательный третий параметр, и если туда передать строку из пробелов, то она будет использоваться в качестве отступа.

Всем спасибо за участие.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
Piterski
@Piterski
Я точно не помню и могу ошибаться, но разве в FireBug нет функции просмотра ответа в json формате? Для отладки самое то.
Ответ написан
Комментировать
skyboy
@skyboy
Посмотрите на эту библиотеку, возможно это подойдет. archive.dojotoolkit.org/nightly/dojotoolkit/dojox/gfx/demos/beautify.html
Ответ написан
Комментировать
Посмотрите эту ссылку
Ответ написан
Комментировать
foxmuldercp
@foxmuldercp
Системный администратор, программист, фотограф
Кстати, в Киеве сколько нод живых то осталось?:)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы