9

JSON is written either with indent=None (default) as a single line (unreadable to a human eye) or with ident=N with a newline after each comma.

What I would like to see is a more compact but still pretty output, similar to what Common Lisp pretty-printing does. E.g., instead of

 {
  "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"
 }

I would like to see

 {
  "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"
 }

similar to what pprint produces.

sds
  • 55,681
  • 23
  • 150
  • 247

3 Answers3

2

This is not possible at this time, but when RFE: more compact pretty printing is implemented, this question will be answered by using python-rapidjson.

sds
  • 55,681
  • 23
  • 150
  • 247
1

I don't know of a tool that already does this, but it isn't hard to make one:

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('}')

For your example, this emits:

>>> 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",
}
Raymond Hettinger
  • 199,887
  • 59
  • 344
  • 454
  • This does not handle deeper nesting and more complex structures. – sds Jan 27 '20 at 12:39
  • @sds Adding a little recursion isn't hard to do. The purpose of an answer is to point the way. It is not the job of respondent to write a production tool that meets all desires for all possible users. In this case, it produces exactly what the OP asked for and it easy to understand. – Raymond Hettinger Apr 11 '21 at 03:36
  • What will be the library for `dumps`? – alper Jul 30 '21 at 21:39
0

This won't get it quite as tight as you want, but it is the format I find most satisfying. You can test it online at https://beautifier.io/

pip install jsbeautifier

To use:

import jsbeautifier
print( jsbeautifier.beautify(json.dumps(data)) )
Orwellophile
  • 12,311
  • 3
  • 63
  • 40