Компактный, но красивый вывод 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.