如何在 Python 中美化 JSON?

有人能建议我如何用 Python 或通过命令行美化 JSON 吗?

唯一可以做到这一点的在线 JSON 美化器是: http://jsonviewer.stack.hu/

但是,我需要在 Python 内部使用它。

这是我的数据集:

{ "head": {"vars": [ "address" , "description" ,"listprice" ]} , "results": { "bindings": [
{
"address" : { "type":"string", "value" : " Dyne Road, London NW6"},
"description" :{ "type":"string", "value" : "6 bed semi detached house"},
"listprice" : { "type":"string", "value" : "1,150,000"}
}
,
{
"address" : { "type":"string", "value" : " Tweedy Road, Bromley BR1"},
"description" :{ "type":"string", "value" : "5 bed terraced house"},
"listprice" : { "type":"string", "value" : "550,000"}
}
,
{
"address" : { "type":"string", "value" : " Vera Avenue, London N21"},
"description" :{ "type":"string", "value" : "4 bed detached house"},
"listprice" : { "type":"string", "value" : "


995,000




"}
}
,
{
"address" : { "type":"string", "value" : " Wimbledon Park Side, London SW19"},
"description" :{ "type":"string", "value" : "3 bedroom  property for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Westbere Road, West Hampstead, London NW2"},
"description" :{ "type":"string", "value" : "5 bedroom  semi detached house for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " The Avenue, Hatch End, Pinner HA5"},
"description" :{ "type":"string", "value" : "5 bedroom  detached house for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Princes Park Avenue, London NW11"},
"description" :{ "type":"string", "value" : "4 bedroom  detached house for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Canons Drive, Edgware HA8"},
"description" :{ "type":"string", "value" : "4 bedroom  detached house for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Westbere Road, West Hampstead NW2"},
"description" :{ "type":"string", "value" : "5 bedroom  property for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Haymills Estate, Ealing, London"},
"description" :{ "type":"string", "value" : "5 bedroom  property for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Dene Terrace Woodclyffe Drive, Chislehurst, Kent BR7"},
"description" :{ "type":"string", "value" : "5 bedroom  terraced house for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Dene Terrace Woodclyffe Drive, Chislehurst, Kent BR7"},
"description" :{ "type":"string", "value" : "5 bedroom  semi detached house for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Northwick Close, St John's Wood NW8"},
"description" :{ "type":"string", "value" : "3 bedroom  property for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Claremont Gardens, Surbiton KT6"},
"description" :{ "type":"string", "value" : "13 bedroom  property for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Dene Terrace Woodclyffe Drive, Chislehurst, Kent BR7"},
"description" :{ "type":"string", "value" : "5 bedroom  end terrace house for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Stamford Road, London N1"},
"description" :{ "type":"string", "value" : "4 bedroom  terraced house for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Stanhope Avenue, London N3"},
"description" :{ "type":"string", "value" : "6 bedroom  property for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Haymills Estate, Ealing, London"},
"description" :{ "type":"string", "value" : "5 bedroom  property for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Elms Crescent, London SW4"},
"description" :{ "type":"string", "value" : "5 bedroom  property for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Princes Park Avenue, London NW11"},
"description" :{ "type":"string", "value" : "4 bedroom  property for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Abbeville Road, London SW4"},
"description" :{ "type":"string", "value" : "4 bedroom  property for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Canons Drive, Edgware HA8"},
"description" :{ "type":"string", "value" : "4 bedroom  detached house for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Henson Avenue, Willesdon Green NW2"},
"description" :{ "type":"string", "value" : "5 bedroom  property for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Woodstock Road, London NW11"},
"description" :{ "type":"string", "value" : "5 bedroom  property for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Tamworth Street, London SW6"},
"description" :{ "type":"string", "value" : "5 bedroom  property for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Stanhope Avenue, Finchley, London"},
"description" :{ "type":"string", "value" : "5 bedroom  semi detached house for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " The Old Burlington, Church Street, London W4"},
"description" :{ "type":"string", "value" : "3 bedroom  property for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Ebury Close, Northwood HA6"},
"description" :{ "type":"string", "value" : "4 bedroom  detached house for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Middleton Road, London NW11"},
"description" :{ "type":"string", "value" : "4 bedroom  property for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Henson Avenue, Willesden Green NW2"},
"description" :{ "type":"string", "value" : "5 bedroom  property for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Huron Road, London SW17"},
"description" :{ "type":"string", "value" : "6 bedroom  property for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Corringway, Ealing W5"},
"description" :{ "type":"string", "value" : "5 bedroom  detached house for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Woodlands Avenue, New Malden KT3"},
"description" :{ "type":"string", "value" : "5 bedroom  detached house for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Gunnersbury Park Area, Ealing, London"},
"description" :{ "type":"string", "value" : "6 bedroom  property for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Blenheim Gardens, London, Brent NW2"},
"description" :{ "type":"string", "value" : "6 bedroom  property for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Creighton Road, London NW6"},
"description" :{ "type":"string", "value" : "4 bedroom  terraced house for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Plaistow Lane, Bromley BR1"},
"description" :{ "type":"string", "value" : "7 bedroom  detached house for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Greenfield Gardens, London NW2"},
"description" :{ "type":"string", "value" : "4 bedroom  property for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Hendon Avenue, London N3"},
"description" :{ "type":"string", "value" : "3 bedroom  detached house for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Peckham Park Road, London SE15"},
"description" :{ "type":"string", "value" : "6 bedroom  semi detached house for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Woodclyffe Drive, Chislehurst BR7"},
"description" :{ "type":"string", "value" : "5 bedroom  house for sale"},
"listprice" : { "type":"string", "value" : "


From 1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Highwood Hill, Mill Hill, London"},
"description" :{ "type":"string", "value" : "5 bedroom  detached house for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Stanhope Avenue, London N3"},
"description" :{ "type":"string", "value" : "5 bedroom  semi detached house for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Kersley Mews, London SW11"},
"description" :{ "type":"string", "value" : "3 bedroom  mews for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Ebury Close, Northwood HA6"},
"description" :{ "type":"string", "value" : "4 bedroom  detached house for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Ellesmere Road, Chiswick W4"},
"description" :{ "type":"string", "value" : "6 bedroom  detached house for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " The Avenue, Hatch End, Pinner, Middlesex"},
"description" :{ "type":"string", "value" : "5 bedroom  detached house for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Wandsworth, London SW18"},
"description" :{ "type":"string", "value" : "6 bedroom  semi detached house for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Carlton Road, New Malden KT3"},
"description" :{ "type":"string", "value" : "4 bedroom  detached house for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " St Mary's Mews, Ealing W5"},
"description" :{ "type":"string", "value" : "3 bedroom  property for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Ritherdon Road, Balham, London SW17"},
"description" :{ "type":"string", "value" : "5 bedroom  semi detached house for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Goldsmith Avenue, London W3"},
"description" :{ "type":"string", "value" : "5 bedroom  property for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
,
{
"address" : { "type":"string", "value" : " Plaistow Lane, Bromley, Kent BR1"},
"description" :{ "type":"string", "value" : "7 bedroom  detached house for sale"},
"listprice" : { "type":"string", "value" : "


1,250,000




"}
}
] } }
198757 次浏览

从命令行:

echo '{"one":1,"two":2}' | python -mjson.tool

产出:

{
"one": 1,
"two": 2
}

从编程上讲,Python 手册 描述打印漂亮的 JSON:

>>> import json
>>> print json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4)
{
"4": 5,
"6": 7
}

我在 python 中使用的 cli 命令是:

cat myfile.json | python -mjson.tool

你应该可以在这里找到更多的信息:

Http://docs.python.org/library/json.html

使用 python 工具库

命令行: python-mjson.tool

密码: http://docs.python.org/library/json.html

使用 Json 模块dumps函数的 indent参数。

来自文件:

>>> import json
>>> print json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4)
{
"4": 5,
"6": 7
}

您的数据格式不正确。值字段具有许多空格和新行。自动格式化程序不能处理这个问题,因为它们不会修改实际的数据。在生成用于输出的数据时,根据需要对其进行筛选,以避免使用空格。

alias jsonp='pbpaste | python -m json.tool'

这将很好地打印 OSX 中剪贴板上的 JSON。只需复制它,然后从 Bash 提示符调用别名。

试试 下划线-cli:

cat myfile.json | underscore print --color

它是一个非常漂亮的工具,可以优雅地对结构化数据进行大量操作,执行 js 片段,填充模板等等。它有很好的文档记录,经过精心打磨,可以认真使用。是我写的。:)

您可以将输出通过管道发送到 jq

print json.dumps(data)

然后你就可以开枪了:

python foo.py | jq '.'

使用 jsonlint (如 xmllint) :

aptitude install python-demjson
jsonlint -f foo.json

一个最小的 python 内部解决方案,通过命令行提供 json 数据:

import sys
import json
from pygments import highlight, lexers, formatters


formatted_json = json.dumps(json.loads(sys.argv[1]), indent=4)
colorful_json = highlight(unicode(formatted_json, 'UTF-8'), lexers.JsonLexer(), formatters.TerminalFormatter())
print(colorful_json)

灵感来自于上面提到的 pjson。这个代码需要安装 pygments

输出示例:

enter image description here

看起来 美容师开源了它们的工具,并将它们打包为 Python 和 JS 库以及 CLI 工具。看起来他们没有呼叫网络服务,但是我没有仔细检查。请参阅带有安装说明的 Github Repo


来自 Python CLI 和库使用的文档:

使用 python 美化:

$ pip install jsbeautifier
$ js-beautify file.js

美化输出到 stdout

使用 jsbeautifier作为库很简单:

import jsbeautifier
res = jsbeautifier.beautify('your javascript string')
res = jsbeautifier.beautify_file('some_file.js')

... 或者,指定一些选项:

opts = jsbeautifier.default_options()
opts.indent_size = 2
res = jsbeautifier.beautify('some javascript', opts)

如果您想传递一个字符串而不是文件名,并且您正在使用 bash,那么您可以像下面这样使用进程替换:

$ js-beautify <(echo '{"some": "json"}')

首先安装 pygments

那么

echo '<some json>' | python -m json.tool | pygmentize -l json

我不喜欢 json.dump (...)-> 的输出,因为我觉得换行太多了。我不想使用命令行工具或者安装什么东西。 我终于找到了 Python 印刷品(= pretty print)。 不幸的是,它不能生成正确的 JSON,但是我认为对存储的数据进行用户友好的扫描是有用的。

json.dumps(json_dict, indent=4)输出

{
"hyperspace": {
"constraints": [],
"design": [
[
"windFarm.windparkSize.k",
"continuous",
[
0,
0,
5
]
],
[
"hydroPlant.primaryControlMax",
"continuous",
[
100,
300
]
]
],
"kpis": [
"frequency.y",
"city.load.p[2]"
]
},
"lhc_size": 10,
"number_of_runs": 10
}

Pprint 的用法:

import pprint


json_dict = {"hyperspace": {"constraints": [], "design": [["windFarm.windparkSize.k", "continuous", [0, 0, 5]], ["hydroPlant.primaryControlMax", "continuous", [100, 300]]], "kpis": ["frequency.y", "city.load.p[2]"]}, "lhc_size": 10, "number_of_runs": 10}


formatted_json_str = pprint.pformat(json_dict)
print(formatted_json_str)
pprint.pprint(json_dict)

pprint.pformat(...)pprint.pprint(...)的测试结果:

{'hyperspace': {'constraints': [],
'design': [['windFarm.windparkSize.k', 'continuous', [0, 0, 5]],
['hydroPlant.primaryControlMax',
'continuous',
[100, 300]]],
'kpis': ['frequency.y', 'city.load.p[2]']},
'lhc_size': 10,
'number_of_runs': 10}