Обычный итог работы функции
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?