Como prettyprint um arquivo JSON?

Eu tenho um arquivo JSON que é uma bagunça que eu quero prettyprint -- Qual é a maneira mais fácil de fazer isso em python? Eu sei que PrettyPrint leva um "objeto", que eu acho que pode ser um arquivo, mas eu não sei como passar um arquivo em-- apenas usar o nome do arquivo não funciona.

Author: martineau, 2012-10-18

7 answers

O módulo json já implementa alguma impressão pretty básica com o parâmetro 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
        ]
    }
]

Para processar um ficheiro, use json.load:

with open('filename.txt', 'r') as handle:
    parsed = json.load(handle)
 1005
Author: Blender, 2012-10-17 21:54:12

Pode fazer isto na linha de comando:

cat some.json | python -m json.tool
(Como já mencionado nos comentários à pergunta).

Na verdade o python não é a minha ferramenta favorita no que diz respeito ao processamento de json na linha de comandos. Para impressão simples e bonita é ok, mas se você quiser manipular o json ele pode se tornar excessivamente complicado. Em breve terá de escrever um ficheiro de script separado, podendo acabar com mapas cujas chaves são u "some-key" (python unicode), o que torna a selecção de campos mais difícil e realmente não vai na direção de impressão bonita.

Eu uso jq . O acima pode ser feito com:

cat some.json | jq ''

E você recebe cores como um bônus (e muito mais fácil extendabilidade).

 200
Author: Gismo Ranas, 2015-09-07 08:48:24

Pygmentize + Python json.ferramenta = impressão bonita com realce de sintaxe

O Pygmentize é uma ferramenta de matar. Vê isto. Eu combino JSON python.ferramenta com pygmentize
echo '{"foo": "bar"}' | python -m json.tool | pygmentize -l json

Ver a ligação acima para instruções de instalação pygmentize.

Uma demonstração disto está na imagem abaixo:

demo

 39
Author: Shubham Chaudhary, 2018-01-30 09:20:59

Use esta função e não se preocupe por ter de se lembrar se o seu JSON é um str ou dict de novo-basta olhar para a impressão bonita:

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)
 30
Author: zelusp, 2016-06-14 03:53:03

Podias usar a tinta incorporada .

Como pode ler o ficheiro com os dados do json e imprimi-lo?
import json
import pprint

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

pprint.pprint(json_data)
 17
Author: ikreb, 2018-08-28 15:30:44

Ser capaz de imprimir bastante a partir da linha de comando e ser capaz de ter controle sobre a indentação, etc. pode configurar um nome alternativo semelhante a este:

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

E depois usar a alcunha de uma destas formas:

cat myfile.json | jsonpp
jsonpp < myfile.json
 8
Author: V P, 2017-03-28 14:58:37

Aqui está um exemplo simples de imprimir JSON na consola de uma forma agradável em Python, sem exigir que o JSON esteja no seu computador como um ficheiro local:

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))
 4
Author: David Liu, 2018-01-23 08:19:48