如何打印JSON文件?


1056

我有一个JSON文件,我想对其进行漂亮打印-在python中执行此操作的最简单方法是什么?我知道PrettyPrint带有一个“对象”,我认为它可以是一个文件,但是我不知道如何传递文件-仅使用文件名是行不通的。


9
尝试使用解析JSON,json.loads()并漂亮地打印生成的字典。或直接跳至的Python 文档的“ 漂亮打印”部分。json
Blender 2012年


1
@Blender,如果您发布答案,我会给您功劳...这可能会重复出现,因为解决方法相同,但是问题不同,所以也许不一样。
科琳2012年

18
为什么不像<your_file.js python -mjson.tool@ed的链接中那样?
jfs 2012年

11
我不认为这是重复的,因为从命令行进行漂亮打印与从Python以编程方式进行漂亮打印并不相同。投票重新开放。
vitaut 2015年

Answers:


1655

json模块已经使用indent参数实现了一些基本的漂亮打印:

>>> import json
>>>
>>> your_json = '["foo", {"bar":["baz", null, 1.0, 2]}]'
>>> parsed = json.loads(your_json)
>>> print(json.dumps(parsed, indent=4, sort_keys=True))
[
    "foo", 
    {
        "bar": [
            "baz", 
            null, 
            1.0, 
            2
        ]
    }
]

要解析文件,请使用json.load()

with open('filename.txt', 'r') as handle:
    parsed = json.load(handle)

142
对于简单的漂亮打印,这也无需显式解析即可工作:print json.dumps(your_json_string, indent=4)
Peterino

1
缩进是做什么的?
timbram 2015年

8
@timbram:这是缩进的空格数。
搅拌器

9
没有缩进,您只会看到一行丑陋的文字,这就是为什么我来这里。
krs013 '16

5
@Peterino我必须首先解析json字符串:print(json.dumps(json.loads(your_json_string), indent=2))否则它只是向我显示了一个转义的字符串
vladkras

310

您可以在命令行上执行此操作:

python3 -m json.tool some.json

(正如问题注释中已经提到的,感谢@Kai Petzke的python3建议)。

实际上,就命令行上的json处理而言,python不是我最喜欢的工具。简单的漂亮打印是可以的,但是如果您要操作json,它可能会变得过于复杂。您很快就需要编写一个单独的脚本文件,最终可能得到其键为u“ some-key”(python unicode)的地图,这会使选择字段更加困难,并且实际上并没有朝着漂亮的方向发展。 -印刷。

您也可以使用jq

jq . some.json

并获得颜色作为奖励(并且更容易扩展)。

附录:关于使用jq一方面处理大型JSON文件,另一方面使用非常大的jq程序的注释有些混乱。对于漂亮地打印由单个大型JSON实体组成的文件,实际的限制是RAM。对于漂亮地打印由单个真实数据数组组成的2GB文件,漂亮打印所需的“最大驻留集大小”为5GB(无论使用jq 1.5还是1.6)。还要注意,jq可以在python之后使用pip install jq


4
JQ很棒,但是有一个最大限制,因此它对大文件没有用。(即炸毁处理一个1.15mb的文件)github.com/stedolan/jq/issues/1041
克里斯·麦基

3
是的,当然,如果您要编写包含超过1万行代码的jq过滤器,我想您正在尝试的事情是骑自行车去火星。
吉斯莫·拉纳斯

2
大声笑:D @ gismo-ranas通过管道传输到文件的json.tool版本在大型文件上确实非常有效;而且速度很快。我喜欢JQ,但是格式化超出小的有效载荷(在大多数文本编辑器中可以执行的操作)的方法是无法实现的:)随机添加:json-generator.com是用于生成测试数据的灵巧工具
克里斯·麦基

5
或者只是:jq '' < some.json
fatal_error

2
实际上,我强烈建议您使用python3 -m json.tool <IN >OUT,因为这会保持JSON dict中字段的原始顺序。python解释器版本2按字母升序对字段进行排序,而这并不是您想要的。
Kai Petzke

55

您可以使用内置的modul pprint(https://docs.python.org/3.6/library/pprint.html)

如何读取带有json数据的文件并打印出来。

import json
import pprint

json_data = None
with open('filename.txt', 'r') as f:
    data = f.read()
    json_data = json.loads(data)

pprint.pprint(json_data)

4
问题是pprint将可互换地使用单引号和双引号,但是json只需要双引号,因此您的pprinted json可能不再解析为有效json。
drevicko

1
是的,但这只是输出json文件。不要获取输出并将其再次写入文件。
ikreb

52

Pygmentize + Python json.tool =带有语法突出显示的漂亮打印

Pygmentize是杀手级工具。看到这个。

我结合python json.tool与pygmentize

echo '{"foo": "bar"}' | python -m json.tool | pygmentize -l json

有关pygmentize安装说明,请参见上面的链接。

下图是一个演示:

演示


1
在您的示例中,-g它实际上并不起作用;)由于输入来自stdin,因此pygmentize无法做出很好的猜测。您需要明确指定词法分析器:echo '{"foo": "bar"}' | python -m json.tool | pygmentize -l json
Denis The Menace

1
@DenisTheMenace在创建此示例图像时,它曾经在2015年工作。现在看来在我的系统上也无法正常工作。
Shubham Chaudhary18年

36

使用此功能,不出汗不必记住,如果你的JSON是一种strdict再次-这个漂亮的打印只要看看:

import json

def pp_json(json_thing, sort=True, indents=4):
    if type(json_thing) is str:
        print(json.dumps(json.loads(json_thing), sort_keys=sort, indent=indents))
    else:
        print(json.dumps(json_thing, sort_keys=sort, indent=indents))
    return None

pp_json(your_json_string_or_dict)

14

我曾经写过一个prettyjson()函数来产生漂亮的输出。您可以从此仓库中获取实现。

此功能的主要功能是尝试将dict和list项目保持在一行中,直到maxlinelength达到确定的水平为止。这样会产生更少的JSON行,输出看起来更紧凑且更易于阅读。

您可以产生这种输出,例如:

{
  "grid": {"port": "COM5"},
  "policy": {
    "movingaverage": 5,
    "hysteresis": 5,
    "fan1": {
      "name": "CPU",
      "signal": "cpu",
      "mode": "auto",
      "speed": 100,
      "curve": [[0, 75], [50, 75], [75, 100]]
    }
}

UPD 19年12月:我将代码放入单独的存储库中,更正了一些错误,并进行了其他一些调整。


我认为此格式化程序是建议使用的最好的格式化程序,值得更多推荐。
thorhunter

13

为了能够从命令行进行漂亮的打印并能够控制缩进等,您可以设置类似于以下的别名:

alias jsonpp="python -c 'import sys, json; print json.dumps(json.load(sys.stdin), sort_keys=True, indent=2)'"

然后以下列方式之一使用别名:

cat myfile.json | jsonpp
jsonpp < myfile.json

11

使用pprint:https ://docs.python.org/3.6/library/pprint.html

import pprint
pprint.pprint(json)

print() 相比 pprint.pprint()

print(json)
{'feed': {'title': 'W3Schools Home Page', 'title_detail': {'type': 'text/plain', 'language': None, 'base': '', 'value': 'W3Schools Home Page'}, 'links': [{'rel': 'alternate', 'type': 'text/html', 'href': 'https://www.w3schools.com'}], 'link': 'https://www.w3schools.com', 'subtitle': 'Free web building tutorials', 'subtitle_detail': {'type': 'text/html', 'language': None, 'base': '', 'value': 'Free web building tutorials'}}, 'entries': [], 'bozo': 0, 'encoding': 'utf-8', 'version': 'rss20', 'namespaces': {}}

pprint.pprint(json)
{'bozo': 0,
 'encoding': 'utf-8',
 'entries': [],
 'feed': {'link': 'https://www.w3schools.com',
          'links': [{'href': 'https://www.w3schools.com',
                     'rel': 'alternate',
                     'type': 'text/html'}],
          'subtitle': 'Free web building tutorials',
          'subtitle_detail': {'base': '',
                              'language': None,
                              'type': 'text/html',
                              'value': 'Free web building tutorials'},
          'title': 'W3Schools Home Page',
          'title_detail': {'base': '',
                           'language': None,
                           'type': 'text/plain',
                           'value': 'W3Schools Home Page'}},
 'namespaces': {},
 'version': 'rss20'}

pprint不会产生有效的JSON文档。
selurvedu

5

这是一个简单的示例,可以在Python中以一种不错的方式将JSON打印到控制台,而无需将JSON作为本地文件存储在您的计算机上:

import pprint
import json 
from urllib.request import urlopen # (Only used to get this example)

# Getting a JSON example for this example 
r = urlopen("https://mdn.github.io/fetch-examples/fetch-json/products.json")
text = r.read() 

# To print it
pprint.pprint(json.loads(text))

我在Python 3中收到以下错误消息:“ TypeError:JSON对象必须为str,而不是'bytes'”
T先生,

3
def saveJson(date,fileToSave):
    with open(fileToSave, 'w+') as fileToSave:
        json.dump(date, fileToSave, ensure_ascii=True, indent=4, sort_keys=True)

它可以显示或保存到文件中。


1

我认为最好先解析json,以避免出现错误:

def format_response(response):
    try:
        parsed = json.loads(response.text)
    except JSONDecodeError:
        return response.text
    return json.dumps(parsed, ensure_ascii=True, indent=4)

1

您可以尝试pprintjson


安装

$ pip3 install pprintjson

用法

使用pprintjson CLI从文件漂亮地打印JSON。

$ pprintjson "./path/to/file.json"

使用pprintjson CLI从标准输入漂亮地打印JSON。

$ echo '{ "a": 1, "b": "string", "c": true }' | pprintjson

使用pprintjson CLI从字符串漂亮地打印JSON。

$ pprintjson -c '{ "a": 1, "b": "string", "c": true }'

从缩进为1的字符串漂亮地打印JSON。

$ pprintjson -c '{ "a": 1, "b": "string", "c": true }' -i 1

从字符串漂亮地打印JSON并将输出保存到文件output.json。

$ pprintjson -c '{ "a": 1, "b": "string", "c": true }' -o ./output.json

输出量

在此处输入图片说明


0

它远非完美,但可以做到。

data = data.replace(',"',',\n"')

您可以对其进行改进,添加缩进等,但是如果您只想能够阅读更简洁的json,则可以采用这种方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.