JSONファイルをプリティプリントする方法は?


1059

乱雑なJSONファイルをプリティプリントしたい-Pythonでこれを行う最も簡単な方法は何ですか?PrettyPrintは「オブジェクト」を取得することを知っていますが、これはファイルである可能性がありますが、ファイルを渡す方法がわかりません。ファイル名を使用するだけでは機能しません。


9
を使用json.loads()してJSONを解析し、結果の辞書をきれいに出力してください。または、Python ドキュメントのPretty Printing」セクションにスキップしてください。json
Blender


1
@Blender回答を投稿した場合、クレジットを差し上げます...解決策は同じですが、質問が異なるため、おそらく重複していない可能性があります。
Colleen

18
<your_file.js python -mjson.tool@edのリンクのようにしないのはなぜですか?
jfs 2012年

11
コマンドラインからのpretty-printingは、Pythonからのプログラムによるpretty-printingと同じではないので、重複しているとは思いません。投票を再開します。
vitaut

回答:


1661

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)

143
シンプルがこれをかなり印刷にも明示的な構文解析せずに動作します:print json.dumps(your_json_string, indent=4)
Peterino

1
インデントは何をしますか?
timbram 2015年

8
@timbram:インデントするスペースの数です。
Blender 2015年

9
インデントなしでは、醜いテキストが1行だけ表示されるため、ここに来ました。
krs013 2016年

6
@Peterino最初にjson文字列を解析する必要がありました。print(json.dumps(json.loads(your_json_string), indent=2))それ以外の場合、エスケープされた文字列が表示されました
vladkras

310

コマンドラインでこれを行うことができます:

python3 -m json.tool some.json

(質問の解説ですでに述べたように、python3の提案を@Kai Petzkeに感謝します)。

コマンドラインでの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
Chris McKee

3
ええ、確かに、10000行を超えるコードでjqフィルターを記述している場合、自転車で火星に行くようなことを試みていると思います。
Gismo Ranas 2016年

2
lol:D @ gismo-ranasファイルにパイプされたjson.toolバージョンは、大きなファイルで非常にうまく機能します。と愚かに高速です。I JQのようなが、その範囲を超えている:)ランダム加算(あなたはほとんどのテキストエディタで行うことができます)、小さなペイロードを超えて何かをフォーマットする:json-generator.comするテストデータを作るためにきちんとしたツールである
クリス・マッキー

5
または単に:jq '' < some.json
fatal_error

2
実際、私はを使用することを強くお勧めしpython3 -m json.tool <IN >OUTます。これにより、JSON辞書のフィールドの元の順序が維持されます。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は二重引用符のみを必要とするため、pprintされたjsonが有効なjsonとして解析されなくなる可能性があります。
drevicko

1
はい、しかしそれはjsonファイルを出力することだけです。出力を取得せずに、ファイルに再度書き込む。
ikreb 2018

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
デニス・ザ・メナス

1
@DenisTheMenaceこのサンプル画像を作成した2015年に機能していました。私のシステムでも動作していないようです。
Shubham Chaudhary

36

この関数を使用すれば、JSONが1 strつ以上であるかどうかを覚える必要dictがなくなります。きれいな印刷物を見てください。

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()見栄えのする出力を生成する関数を書いたことがあります。このリポジトリから実装を取得できます。

この関数の主な機能は、特定の値maxlinelengthに達するまで、dictおよびリスト項目を1行で保持しようとすることです。これにより、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 Dec'19:コードを別のリポジトリに配置し、いくつかのバグを修正し、他のいくつかの調整を行いました。


このフォーマッターは提案されたフォーマッターの中で最高であると考えています。
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

以下は、JSONをローカルファイルとしてコンピューター上に置く必要なく、Pythonでコンソールに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でなければなりません」
Mr. 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を読むことができるようにしたいだけなら、これは行く方法です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.