14

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
  • 58,617
  • 29
  • 161
  • 278

3 Answers3

3

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)) )

See https://www.npmjs.com/package/js-beautify for help with formatting options and so on.

phhu
  • 1,462
  • 13
  • 33
Orwellophile
  • 13,235
  • 3
  • 69
  • 45
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
  • 58,617
  • 29
  • 161
  • 278
2

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
  • 216,523
  • 63
  • 388
  • 485
  • 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