在Python中如何紧凑但漂亮地输出JSON?

14

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生成的结果。

compact=True 可能会让你达到一半的效果... - juanpa.arrivillaga
1
如果一个对象/数组不包含任何子对象/数组,则将其格式化为单行;否则将其格式化为多个缩进的行。 - o11c
@juanpa.arrivillaga:标准的json模块不支持compact=True - sds
@juanpa.arrivillaga:我使用Python2。 - sds
1
修改json.encoder模块中_make_iterencode函数中的两行if _indent is None代码,然后在子类中替换JSONEncoder.iterencode。不过需要大量复制粘贴。 - o11c
显示剩余2条评论
3个回答

3

这种方式可能无法达到你想要的完美效果,但我认为这是最令人满意的格式。你可以在https://beautifier.io/上在线测试。

pip install jsbeautifier

使用方法:

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

请参考https://www.npmjs.com/package/js-beautify获取有关格式选项等方面的帮助。

2

2
我不知道是否有已经完成此功能的工具,但制作一个并不难:
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",
}

这并不处理更深层次的嵌套和更复杂的结构。 - sds
@sds 添加一点递归并不难。答案的目的是指引方向,而不是回答者的工作是编写一个满足所有可能用户需求的生产工具。在这种情况下,它正好产生了OP所要求的,并且易于理解。 - Raymond Hettinger
dumps 库将是什么? - alper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接