如何相印JSON文件?

问题描述 投票:829回答:11

我有一个JSON文件是一个混乱,我想漂亮 - 在python中最简单的方法是什么?我知道PrettyPrint带有一个“对象”,我认为它可以是一个文件,但我不知道如何传入文件 - 只是使用文件名不起作用。

python json pretty-print
11个回答
1293
投票

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)

1
投票

我曾经写过一个prettyjson()函数来产生漂亮的输出。你可以从this repo获取实现。

这个函数的主要特点是尝试保持字典和列表项在一行,直到达到某个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]]
    }
}

260
投票

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

python3 -m json.tool < some.json

(正如在问题的评论中已经提到的,感谢@Kai Petzke提出的python3建议)。

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

我用jq。以上可以通过以下方式完成:

jq '' < some.json

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


45
投票

Pygmentize + Python json.tool = Pretty Print with Syntax Highlighting

Pygmentize是一种杀手级工具。 See this.

我将python json.tool与pygmentize结合起来

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

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

这个演示如下图所示:

demo


38
投票

你可以使用内置模块pprint

如何使用json数据读取文件并将其打印出来。

import json
import pprint

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

pprint.pprint(json_data)

32
投票

使用此功能,不要再记得你的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)

9
投票

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

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

5
投票

使用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'}

4
投票

下面是一个简单的例子,可以在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))

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)
© www.soinside.com 2019 - 2024. All rights reserved.