Bir JSON dosyası nasıl güzel yazdırılır?


1059

Prettyprint yapmak istediğim bir karmaşa olan bir JSON dosyam var - bunu python'da yapmanın en kolay yolu nedir? PrettyPrint bir dosya olabileceğini düşündüğüm bir "nesne" alır biliyorum, ama nasıl dosya aktarmak için bilmiyorum - sadece dosya adını kullanarak işe yaramaz.


9
JSON'u kullanarak ayrıştırmayı deneyin json.loads()ve ortaya çıkan sözlüğü güzel yazdırın. Ya da sadece Python belgelerinin Pretty baskı bölümüne atlayın . json
Blender


1
@Blender size bir cevap gönderirseniz size kredi vereceğim ... bu bir kopya olarak kapanabilir, çünkü çözüm aynıdır, ancak soru farklıdır, belki de değil.
Colleen

18
neden <your_file.js python -mjson.tool@ ed bağlantısında olduğu gibi değil ?
jfs

11
Yinelenmediğini sanmıyorum çünkü komut satırından güzel baskı, Python'dan programlı olarak güzel baskı ile aynı değil. Yeniden açmak için oylama.
vitaut

Yanıtlar:


1660

jsonModül zaten bazı temel oldukça baskı uygular indentparametresi:

>>> 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
        ]
    }
]

Bir dosyayı ayrıştırmak için şunu kullanın json.load():

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

143
Basit güzel baskı için bu aynı zamanda açık ayrıştırma olmadan da çalışır:print json.dumps(your_json_string, indent=4)
Peterino

1
girinti ne yapar?
timbram

8
@timbram: Girinti yapılacak boşlukların sayısı.
Blender

9
Girinti olmadan, sadece tek bir çirkin metin satırı alırsınız, bu yüzden buraya geldim.
krs013

6
@Peterino Önce json dizesini ayrıştırmak zorunda kaldım: print(json.dumps(json.loads(your_json_string), indent=2))aksi takdirde bana kaçan bir ip gösterdi
vladkras

310

Bunu komut satırında yapabilirsiniz:

python3 -m json.tool some.json

(Sorunun yorumlarında daha önce belirtildiği gibi, python3 önerisi için @Kai Petzke'ye teşekkürler).

Aslında python, komut satırında json işleme söz konusu olduğunda benim en sevdiğim araç değil. Basit güzel baskı için Tamam, ama json manipüle etmek istiyorsanız aşırı karmaşık olabilir. Yakında ayrı bir komut dosyası yazmanız gerekir, anahtarları u "bazı anahtar" (python unicode) olan haritalarla sonuçlayabilirsiniz, bu da alanları seçmeyi zorlaştırır ve gerçekten güzel yönde gitmez -baskı.

Ayrıca jq kullanabilirsiniz :

jq . some.json

ve renkleri bonus olarak elde edersiniz (ve çok daha kolay genişletilebilirlik).

Ek: Bir yandan büyük JSON dosyalarını işlemek için jq kullanma ve diğer tarafta çok büyük bir jq programına sahip olma konusunda yorumlarda biraz karışıklık var. Tek bir büyük JSON varlığından oluşan bir dosyayı güzel yazdırmak için pratik sınırlama RAM'dir. Tek bir gerçek dünya verisinden oluşan 2 GB'lık bir dosyayı güzel yazdırmak için, güzel yazdırma için gereken "maksimum yerleşik ayar boyutu" 5 GB'dı (ister jq 1.5 ister 1.6 olsun). Ayrıca jq'nin python'dan sonra kullanılabileceğini unutmayın pip install jq.


4
JQ harika ama bir maksimum sınır var, bu yüzden büyük dosyalar için işe yaramaz. (örn. 1,15mb'lik bir dosyayı işliyor
Chris McKee

3
evet, adamım, kesinlikle, 10 bin satırdan fazla kod içeren jq filtreleri yazıyorsanız, bisikletle mars yapmak gibi bir şey denediğinizi düşünüyorum.
Gismo Ranas

2
lol: D @ gismo-ranas Bir dosyaya bağlanan json.tool sürümü büyük dosyalar üzerinde gerçekten iyi çalışır; ve aptalca hızlı. Ben JQ gibi ama küçük bir yük ötesinde bir şey biçimlendirmek (çoğu metin editörleri yapabileceğiniz) ulaşmak ötesinde :) Rastgele ek: json-generator.com test verileri yapmak için temiz bir araçtır
Chris McKee

5
ya da sadece:jq '' < some.json
fatal_error

2
Aslında python3 -m json.tool <IN >OUT, JSON dikte alanlarının orijinal sırasını koruduğu için şiddetle kullanmanızı öneririm . Python yorumlayıcı sürüm 2 alanları alfabetik olarak artan sıraya göre sıralar, bu genellikle istediğiniz şey değildir.
Kai Petzke

55

Yerleşik modül pprint'i kullanabilirsiniz (https://docs.python.org/3.6/library/pprint.html) .

Json verileri ile dosyayı nasıl okuyabilir ve yazdırabilirsiniz.

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
Bununla ilgili sorun, pprint'in tek ve çift tırnakları birbirinin yerine kullanmasıdır, ancak json yalnızca çift tırnak gerektirir, bu nedenle pprinted json'unuz artık geçerli json olarak ayrıştırılamayabilir.
drevicko

1
Evet, ancak yalnızca bir json dosyası çıktılamak. Çıktıyı alıp bir dosyaya tekrar yazmamak.
ikreb

52

Pygmentize + Python json.tool = Sözdizimi Vurgulama ile Güzel Baskı

Pygmentize bir katil araçtır. Bunu gör.

Python json.tool'u pygmentize ile birleştiriyorum

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

Pigmentize kurulum talimatı için yukarıdaki bağlantıya bakın.

Bunun bir demosu aşağıdaki resimde:

gösteri


1
Örnekte -gaslında çalışmıyor;) giriş Stdin'den geldiğinden, pygmentize iyi tahminde bulunmak mümkün değildir. Lexer'i açıkça belirtmeniz gerekiyor:echo '{"foo": "bar"}' | python -m json.tool | pygmentize -l json
Denis The Menace

1
@DenisTheMenace Bu örnek görüntüyü oluşturduğumda 2015 yılında çalışırdım. Şimdi benim sistemimde de çalışmıyor gibi görünüyor.
Shubham Chaudhary

36

Bu işlevi kullanın ve JSON'unuzun bir strveya dictdaha fazla olduğunu hatırlamak zorunda kalmayın - sadece güzel baskıya bakın:

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

Bir keresinde prettyjson()hoş görünümlü çıktılar üretmek için bir işlev yazdım . Uygulamayı bu repodan alabilirsiniz .

Bu işlevin ana özelliği, belirli maxlinelengthbir noktaya ulaşılana kadar dikteyi ve öğeleri bir satırda tutmaya çalışmasıdır . Bu, daha az sayıda JSON satırı üretir, çıktı daha kompakt ve daha kolay okunur.

Bu tür çıktılar üretebilirsiniz, örneğin:

{
  "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: Kodu ayrı bir repoya yerleştirdim, birkaç hatayı düzelttim ve birkaç değişiklik yaptım.


Bu biçimlendiricinin önerilenlerden en iyisi olduğunu düşünüyorum, daha fazla oyu hak ediyor.
thorhunter

13

Komut satırından güzel baskı alabilmek ve girinti vb. Üzerinde kontrol sahibi olabilmek için buna benzer bir takma ad oluşturabilirsiniz:

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

Ardından takma adı şu yollardan biriyle kullanın:

cat myfile.json | jsonpp
jsonpp < myfile.json

11

Pprint kullanın: https://docs.python.org/3.6/library/pprint.html

import pprint
pprint.pprint(json)

print() nazaran 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'}

pprintgeçerli bir JSON belgesi oluşturmuyor.
selurvedu

5

İşte JSON'un bilgisayarınızda yerel bir dosya olmasını gerektirmeden JSON'u Python'da konsola güzel bir şekilde yazdırmanın basit bir örneği:

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'te aşağıdaki hata iletisini alıyorum: "TypeError: JSON nesnesi 'bayt' değil, str olmalıdır"
Bay T

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

Bir dosyayı görüntülemek veya kaydetmek için çalışır.


1

Hataları önlemek için daha önce json ayrıştırmak daha iyi olduğunu düşünüyorum:

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'u deneyebilirsiniz .


Kurulum

$ pip3 install pprintjson

kullanım

Pprintjson CLI kullanarak bir dosyadan JSON yazdırmak.

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

Pprintjson CLI kullanarak bir stdin JSON yazdırmak.

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

Pprintjson CLI kullanarak bir dizeden JSON yazdırmak.

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

1 girintili bir dizeden JSON yazdır.

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

Bir dizeden JSON yazdırmak ve çıktı bir dosya output.json kaydedin.

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

Çıktı

resim açıklamasını buraya girin


0

Mükemmel olmaktan uzak, ama işi yapıyor.

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

geliştirebilir, girinti ekleyebilir ve benzeri, ancak sadece daha temiz bir json okumak istiyorsanız, bu yol.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.