Компактный, но красивый вывод JSON в python?

JSON написан либо с indent=None (по умолчанию) в виде одной строки (нечитаемой для человеческого глаза) или с ident=N с новой строкой после каждой запятой.

Я хотел бы видеть более компактный, но все же симпатичный вывод, похожий на то, что делает симпатичная печать Common Lisp. Например, вместо

 {
  "cleanup":{
   "cpu":6936.780000000001,
   "wall":7822.319401979446
  },
  "finished":"2017-08-14 18:36:23",
  "init":{
   "cpu":1365.73,
   "wall":1380.7802910804749
  },
  "job":"timings",
  "run":{
   "cpu":953.6700000000001,
   "wall":8350.496850013733
  },
  "started":"2017-08-14 13:28:06"
 }

Я бы хотел увидеть

 {
  "cleanup":{"cpu":6936.780000000001,"wall":7822.319401979446},
  "finished":"2017-08-14 18:36:23",
  "init":{"cpu":1365.73,"wall":1380.7802910804749},
  "job":"timings",
  "run":{"cpu":953.6700000000001,"wall":8350.496850013733},
  "started":"2017-08-14 13:28:06"
 }

похоже на то, что pprint производит.

3 ответа

Это не сделает его таким плотным, как вы хотите, но это формат, который я нахожу наиболее удовлетворительным. Вы можете протестировать его онлайн на https://beautifier.io/

      pip install jsbeautifier

Использовать:

      import jsbeautifier
print( jsbeautifier.beautify(json.dumps(data)) )

Я не знаю инструмента, который уже делает это, но сделать его несложно:

def compact(d):
    def tight(obj):
        return dumps(obj, separators=(',', ':'))
    print('{')
    for i, (k, v) in enumerate(d.items()):
        comma = ',' if i < len(d) else ''
        print(f' {tight(k)}:{tight(v)}{comma}')
    print('}')

Для вашего примера это испускает:

>>> compact(d)
{
 "cleanup":{"cpu":6936.780000000001,"wall":7822.319401979446},
 "finished":"2017-08-14 18:36:23",
 "init":{"cpu":1365.73,"wall":1380.7802910804749},
 "job":"timings",
 "run":{"cpu":953.6700000000001,"wall":8350.496850013733},
 "started":"2017-08-14 13:28:06",
}

В настоящее время это невозможно, но когда реализована RFE: более компактная и приятная печать, на этот вопрос ответит использование python-rapidjson.

Другие вопросы по тегам