Есть ли какие-нибудь симпатичные принтеры JSON, которые стараются быть краткими? - PullRequest
5 голосов
/ 16 мая 2011

Мне нужен симпатичный принтер JSON, который распознает, когда массив или объект помещается на одной строке, и просто делает это. Пример:

{
  "fits": ["JSON", "pretty", "printer"],
  "longer": [
    "???????????????????????????????????????????????????",
    "???????????????????????????????????????????????????",
    "???????????????????????????????????????????????????",
    "???????????????????????????????????????????????????",
    "???????????????????????????????????????????????????"
  ]
}

Есть ли отдельная библиотека, подобная этой? Если нет, то как мне написать один?

Меня больше всего интересует реализация JavaScript.

Ответы [ 3 ]

0 голосов
/ 07 июня 2011

Поскольку JSON - это прежде всего формат передачи данных, я предполагаю, что вы имеете в виду просмотр необработанного JSON в браузере?Если это так, то есть несколько вариантов:

Вы должны быть в состоянии найти источникпоследние три, если вам требуется дополнительная настройка.Я бы начал с итерации свойства value.length, где value - это / являются элементы массива, чтобы посмотреть, можете ли вы ограничить вывод одной строкой.

0 голосов
/ 02 июля 2013

Используйте функцию replacer , чтобы сравнить общее количество символов в каждой паре ключ / значение с фиксированной длиной.Вот простой пример:

function replacer(key, value)
  {
  var key_arr = [];
  var value_arr = [];
  var i = 0;
  for (_ in value)
    {
    key_arr.push(_);
    value_arr.push(value[_]);
    }
  for(;i < value_arr.length;i++)
    {
    if (key_arr[i].length + value_arr[i].length < 80)
      {
      console.log(key_arr[i] + ":" + "\t" + value_arr[i])
      }
    else
      {
      console.log(key_arr[i] + ":" + "\n" + value_arr[i])
      }
    }
  }

Использование:

var json;

json = {"foo":"1","bar":"2"},      
JSON.stringify(json, replacer, 4);

json = {"foo":"12345678901234567890123456789012345678901234567890123456789012345678901234567890","bar":"2"};

JSON.stringify(json, replacer, 4);
0 голосов
/ 16 мая 2011

Я не знаю ни о каком таком лаконичном принтере JSON, но вам не составит труда сделать свой собственный, если вы хотите:

  • Вы можете использовать for(property in object) для перебора свойств данного объекта.
    • В зависимости от варианта использования вы можете фильтровать с помощью hasOwnProperty.
  • Вы можете определить, указывает ли ссылка на объект, массив, строку или число с помощью typeof
  • Пусть ваша симпатичная функция принтера получит начальное смещение отступа и объект для печати. Этого может быть достаточно, чтобы решить, стоит ли указывать каждое свойство или нет.
    • Я не уверен, что эта «жадная» стратегия всегда «оптимальна» - возможно, было бы лучше сделать что-то в несколько строк сейчас, чтобы иметь возможность встроиться позже. Сначала я не стал бы беспокоиться об этом.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...