JSON Formatter Python — Průvodce json.dumps()

·Backend Developer·ZkontrolovánoDmitri Volkov·Publikováno

Používejte bezplatný JSON Formatter & Beautifier přímo v prohlížeči — bez instalace.

Vyzkoušet JSON Formatter & Beautifier online →

Když ladím Python API klienta, první věc, po které sáhnu, je python pretty print json — jediné volání json.dumps(data, indent=4) a nečitelný jednořádkový blob se okamžitě stane přehledným. Vestavěný modul json Pythonu to řeší zcela v rámci standardní knihovny — žádná instalace třetích stran není potřeba. Pokud potřebujete rychlý výsledek bez psaní kódu, JSON Formatter od ToolDeck to udělá okamžitě. Tento průvodce pokrývá všechny praktické metody: json.dumps() se všemi parametry, pprint, orjson pro vysoce výkonné formátování, json.tool CLI, a reálné scénáře jako formátování API odpovědí a čtení z disku — vše s kódem kompatibilním s Python 3.8+. Zahrnuje také serializaci vlastních typů jako datetime a UUID, streamování gigabajtových souborů s ijson, a zvýraznění syntaxe v terminálu s rich.

Klíčové závěry
  • json.dumps(data, indent=4) je vestavěno ve stdlib Pythonu od verze 2.6 — žádná instalace není potřeba.
  • Předávejte ensure_ascii=False kdykoli vaše data obsahují diakritiku, znaky CJK nebo emoji.
  • Pro datetime, UUID nebo vlastní třídy použijte parametr default= nebo podtřiďte json.JSONEncoder.
  • separators=(',', ':') odstraní veškeré mezery — použijte pro síťový přenos nebo vkládání do URL.
  • orjson je 5–10× rychlejší než stdlib a nativně podporuje datetime a uuid.UUID.
  • pprint.pprint() vypisuje syntaxi Pythonu (True/None), nikoli platné JSON — nikdy nepoužívejte pro soubory nebo API odpovědi.
  • Pro JSON soubory větší než 50 MB streamujte s ijson místo json.load(), abyste předešli MemoryError.

Co je JSON Pretty Printing?

Pretty printing transformuje hustý, minifikovaný JSON řetězec do lidsky čitelného formátu s konzistentním odsazením a zalomením řádků. Transformace je čistě kosmetická: data jsou identická, mění se pouze prezentace. Modul json Pythonu to řeší zcela v rámci standardní knihovny — nic instalovat není třeba.

Before · json
After · json
{"id":"usr_9f3a2b","name":"Jan Novák","roles":["admin","editor"],"prefs":{"theme":"dark","lang":"cs"}}
{
    "id": "usr_9f3a2b",
    "name": "Jan Novák",
    "roles": [
        "admin",
        "editor"
    ],
    "prefs": {
        "theme": "dark",
        "lang": "cs"
    }
}

json.dumps() — standardní způsob formátování JSON

json.dumps() je součástí standardní knihovny Pythonu od verze 2.6 — stačí import json, žádná instalace není potřeba. Serializuje jakýkoli JSON-kompatibilní objekt Pythonu do formátovaného řetězce. Klíčový parametr je indent: nastavte ho na 4 (nebo 2), abyste dostali čitelný výstup.

Python 3.8+ — minimální příklad
import json

user = {
    "id": "usr_9f3a2b",
    "name": "Jan Novák",
    "roles": ["admin", "editor"],
    "prefs": {"theme": "dark", "lang": "cs"}
}

print(json.dumps(user, indent=4, ensure_ascii=False))
# Output:
# {
#     "id": "usr_9f3a2b",
#     "name": "Jan Novák",
#     "roles": [
#         "admin",
#         "editor"
#     ],
#     "prefs": {
#         "theme": "dark",
#         "lang": "cs"
#     }
# }

Pro produkční použití budete často chtít sort_keys=True (konzistentní výstup mezi spuštěními) a ensure_ascii=False (ponechat non-ASCII znaky čitelné):

Python 3.8+ — s sort_keys a ensure_ascii
import json

api_response = {
    "timestamp": "2024-05-01T10:30:00Z",
    "status": "success",
    "data": {
        "user_id": "usr_9f3a2b",
        "display_name": "Petra Dvořáková",
        "score": 4892.5,
        "tags": ["python", "backend", "api"]
    }
}

print(json.dumps(api_response, indent=4, sort_keys=True, ensure_ascii=False))
# Output (klíče seřazeny, diakritika zachována):
# {
#     "data": {
#         "display_name": "Petra Dvořáková",
#         "score": 4892.5,
#         "tags": ["api", "backend", "python"],
#         "user_id": "usr_9f3a2b"
#     },
#     "status": "success",
#     "timestamp": "2024-05-01T10:30:00Z"
# }
Poznámka:json.dumps() vrací řetězec. Pro přímý zápis formátovaného JSON do souboru použijte json.dump(data, f, indent=4) (bez s) — zapisuje do souborového objektu a vyhne se vytváření mezilehlého řetězce v paměti.

Přehled parametrů json.dumps()

Všechny parametry jsou volitelné kromě samotného objektu. Výchozí nastavení produkuje kompaktní, ASCII-bezpečné JSON — předávejte parametry explicitně pro lidsky čitelný výstup.

Parametr
Typ
Výchozí
Popis
obj
any
Objekt Pythonu k serializaci do řetězce ve formátu JSON.
indent
int | str | None
None
Mezer na úroveň odsazení. None = kompaktní jeden řádek, 0 = pouze zalomení řádků, 4 = standard.
sort_keys
bool
False
Seřadit klíče slovníku abecedně na všech úrovních vnoření.
ensure_ascii
bool
True
Escapovat non-ASCII znaky na \uXXXX. Předejte False pro zachování Unicode znaků tak, jak jsou.
separators
tuple | None
None
Dvojice (sep_položek, sep_klíčů). Použijte (",", ":") pro nejkompaktnější výstup bez mezer.
default
callable | None
None
Voláno pro typy, které nelze serializovat. Vyvolejte TypeError pro odmítnutí hodnoty.
allow_nan
bool
True
Serializovat float("nan") a float("inf") jako JS literály. Předejte False pro vyvolání ValueError.

Kompaktní JSON výstup s parametrem separators

Ve výchozím nastavení json.dumps() odděluje položky pomocí ", " a klíče od hodnot pomocí ": ". Parametr separators přepíše obojí. Předání (',', ':') odstraní veškeré mezery pro nejkompaktnější platné JSON — užitečné pro síťový přenos, vkládání do URL nebo ukládání JSON do sloupce databáze, kde záleží na každém bajtu.

Python 3.8+
import json

payload = {
    "endpoint": "/api/v2/events",
    "filters": {"status": "active", "limit": 100},
    "sort": "desc"
}

# Výchozí — mezery za oddělovači (čitelné)
default_out = json.dumps(payload)
# {"endpoint": "/api/v2/events", "filters": {"status": "active", "limit": 100}, "sort": "desc"}
# len = 88

# Kompaktní — žádné mezery vůbec
compact_out = json.dumps(payload, separators=(',', ':'))
# {"endpoint":"/api/v2/events","filters":{"status":"active","limit":100},"sort":"desc"}
# len = 80  (o 9% méně; úspora roste u větších, hluboce vnořených payloadů)

# Kompaktní + seřazené klíče pro reprodukovatelné cache klíče nebo obsahové hashe
canonical = json.dumps(payload, separators=(',', ':'), sort_keys=True)
print(canonical)
# {"endpoint":"/api/v2/events","filters":{"limit":100,"status":"active"},"sort":"desc"}
Poznámka:Když předáváte indent= spolu s separators=, argument separators řídí pouze inline oddělovače — zalomení řádků a odsazení z indent jsou zachovány. Pro kompaktní jednořádkový výstup vynechte indent (nebo předejte None) a nastavte separators=(',', ':').

Serializace vlastních objektů Pythonu pomocí parametru default

Standardní modul json serializuje slovníky, seznamy, řetězce, čísla, booleany a None — ale vyvoláTypeError pro jakýkoli jiný typ. Dva nejčastější viníci v produkčním kódu jsou objekty datetime a UUID.

Python 3.8+ — TypeError bez vlastního zpracování
import json
from datetime import datetime, timezone
import uuid

order = {
    "order_id": uuid.uuid4(),            # ❌ TypeError: UUID is not JSON serializable
    "placed_at": datetime.now(timezone.utc),  # ❌ TypeError: datetime is not JSON serializable
    "total_usd": 142.50,
    "items": ["pro-subscription", "addon-storage"]
}

json.dumps(order)  # raises TypeError

Přístup 1 — parametr default=

Předejte callable do default=. json.dumps() ho volá pro jakýkoli objekt, který nemůže zpracovat. Vraťte serializovatelnou reprezentaci, nebo vyvolejte TypeError pro typy, které explicitně nepodporujete — nikdy tiše nepřehlížejte neznámé typy.

Python 3.8+
import json
from datetime import datetime, timezone, date
import uuid
from decimal import Decimal

def json_default(obj):
    if isinstance(obj, (datetime, date)):
        return obj.isoformat()
    if isinstance(obj, uuid.UUID):
        return str(obj)
    if isinstance(obj, Decimal):
        return float(obj)
    raise TypeError(f"Type {type(obj).__name__!r} is not JSON serializable")

order = {
    "order_id": uuid.uuid4(),
    "placed_at": datetime(2024, 5, 1, 10, 30, 0, tzinfo=timezone.utc),
    "total_usd": Decimal("142.50"),
    "items": ["pro-subscription", "addon-storage"]
}

print(json.dumps(order, indent=4, default=json_default))
# {
#     "order_id": "a3f1c2d4-e5b6-7890-abcd-ef1234567890",
#     "placed_at": "2024-05-01T10:30:00+00:00",
#     "total_usd": 142.5,
#     "items": ["pro-subscription", "addon-storage"]
# }

Přístup 2 — podtřídění json.JSONEncoder

Pro znovupoužitelnou logiku kódování sdílenou mezi více moduly je podtřídění json.JSONEncoder čistší než předávání funkce default všude. Přepište metodu default a volejte super().default(obj) jako poslední zálohu — zachováte tak správné chování chyb pro nepodporované typy.

Python 3.8+
import json
from datetime import datetime, timezone
import uuid
from decimal import Decimal

class AppEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            return obj.isoformat()
        if isinstance(obj, uuid.UUID):
            return str(obj)
        if isinstance(obj, Decimal):
            return float(obj)
        return super().default(obj)  # raises TypeError for unknown types

order = {
    "order_id": uuid.uuid4(),
    "placed_at": datetime(2024, 5, 1, 10, 30, 0, tzinfo=timezone.utc),
    "total_usd": Decimal("142.50"),
}

# Předejte třídu encoderu přes cls=
print(json.dumps(order, indent=4, cls=AppEncoder))
# Výstup je identický s přístupem default=
Poznámka:Vždy volejte super().default(obj) (nebo explicitně vyvolejte TypeError) pro nerozpoznané typy. Tiché vrácení str(obj) pro vše poškodí objekty, které měly vyvolat chybu — takový bug se v produkci těžko vystopuje.

Zpětné dekódování — object_hook

Kódování je pouze polovina příběhu. Pro rekonstrukci vlastního objektu Pythonu z JSON předejte funkci object_hook do json.loads() nebo json.load(). Hook je volán pro každý dekódovaný JSON objekt (slovník) a může vrátit jakoukoli hodnotu Pythonu namísto něj — čímž získáte kompletní cyklus kódování ↔ dekódování.

Python 3.8+
import json
from datetime import datetime
from dataclasses import dataclass

@dataclass
class Event:
    name: str
    occurred_at: datetime
    user_id: str

def encode_event(obj):
    if isinstance(obj, Event):
        return {
            "__type__": "Event",
            "name": obj.name,
            "occurred_at": obj.occurred_at.isoformat(),
            "user_id": obj.user_id,
        }
    raise TypeError(f"Cannot serialize {type(obj)}")

def decode_event(d):
    if d.get("__type__") == "Event":
        return Event(
            name=d["name"],
            occurred_at=datetime.fromisoformat(d["occurred_at"]),
            user_id=d["user_id"],
        )
    return d

# Kódování
event = Event("login", datetime(2024, 5, 1, 10, 30), "usr_9f3a2b")
json_str = json.dumps(event, default=encode_event, indent=4)

# Dekódování zpět na instanci Event
restored = json.loads(json_str, object_hook=decode_event)
print(type(restored))           # <class 'Event'>
print(restored.occurred_at)     # 2024-05-01 10:30:00
Poznámka:object_hook je volán pro každý vnořený slovník v dokumentu — nejen pro nejvyšší úroveň. Zahrňte diskriminátorové pole (jako "__type__"), aby hook dokázal rozlišit vaše vlastní objekty od prostých slovníků, které mají zůstat tak, jak jsou.

pprint — alternativní modul (a kdy ho nepoužívat)

Modul Pythonu pprint (pretty printer) formátuje datové struktury Pythonu pro čitelnost v terminálu. Pracuje s parsovanými objekty Pythonu, nikoli s JSON řetězci — a jeho výstup používá syntaxi Pythonu, nikoli syntaxi JSON.

Python 3.8+
import json, pprint

raw = '{"sensor_id":"s-441","readings":[23.1,23.4,22.9],"unit":"celsius","active":true}'
data = json.loads(raw)

# pprint — platný Python repr, NENÍ platné JSON
pprint.pprint(data, sort_dicts=False)
# {'sensor_id': 's-441',
#  'readings': [23.1, 23.4, 22.9],
#  'unit': 'celsius',
#  'active': True}        ← Python True, ne JSON true

# json.dumps — platné JSON
print(json.dumps(data, indent=4))
# {
#     "sensor_id": "s-441",
#     "readings": [23.1, 23.4, 22.9],
#     "unit": "celsius",
#     "active": true      ← platné JSON
# }
Varování:Nikdy neposílejte výstup pprint do API endpointu ani ho nezapisujte do .json souboru — rozbije to jakýkoli JSON parser, který očekává standardní syntaxi. Pro vše, co musí být platné JSON, používejte json.dumps(indent=4).

Kdy pprint dává smysl: rychlá inspekce objektů Pythonu v REPL nebo ladícím logu, zejména když objekt obsahuje typy, které nejsou JSON-serializovatelné (sety, instance vlastních tříd, dataclassy před konverzí).

Jak hezky vytisknout JSON odpověď z requests

Nejběžnější reálný scénář: máte JSON soubor na disku nebo HTTP odpověď z API a chcete ji naformátovat pro ladění nebo logování. Oba případy používají stejný přístup — parsovat do slovníku Pythonu, pak formátovat pomocí json.dumps().

Čtení ze souboru

Python 3.8+
import json

try:
    with open("config.json", "r", encoding="utf-8") as f:
        data = json.load(f)

    # Hezký výpis do konzole
    print(json.dumps(data, indent=4, ensure_ascii=False))

    # Nebo zapište formátovanou verzi zpět na disk
    with open("config.pretty.json", "w", encoding="utf-8") as f:
        json.dump(data, f, indent=4, ensure_ascii=False)

except json.JSONDecodeError as e:
    print(f"Invalid JSON: {e}")
except FileNotFoundError:
    print(f"File not found: config.json")

Formátování API odpovědi

Python 3.8+ (requires: pip install requests)
import json, requests
from requests.exceptions import HTTPError, ConnectionError, Timeout

def pretty_print_api(url: str) -> None:
    try:
        resp = requests.get(url, timeout=10)
        resp.raise_for_status()
        print(json.dumps(resp.json(), indent=4, ensure_ascii=False))
    except HTTPError as e:
        print(f"HTTP {e.response.status_code}: {e}")
    except (ConnectionError, Timeout) as e:
        print(f"Network error: {e}")
    except json.JSONDecodeError:
        print(f"Response body is not JSON:\n{resp.text[:500]}")

pretty_print_api("https://api.github.com/repos/python/cpython")
Poznámka:response.json() již parsuje tělo odpovědi — není potřeba volat json.loads() zvlášť. Vždy přidejte raise_for_status() před přístupem k .json(), abyste zachytili chyby 4xx/5xx dříve, než způsobí matoucí chybu parsování.

Formátování JSON z příkazové řádky

Python dodává s json.tool, CLI modulem pro formátování JSON přímo z terminálu — žádný Python skript není potřeba. Je dostupný na jakémkoli počítači s nainstalovaným Pythonem.

bash
# Formátovat lokální soubor
python -m json.tool config.json

# Přesměrovat API odpověď přes formátovač
curl -s https://api.github.com/users/gvanrossum | python -m json.tool

# Formátovat ze stdin
echo '{"service":"api-gateway","version":"2.1.0","healthy":true}' | python -m json.tool

# Seřadit klíče abecedně
python -m json.tool --sort-keys data.json

# Vlastní odsazení (Python 3.9+)
python -m json.tool --indent 2 data.json
Poznámka:Python 3.9 přidal příznaky --indent a --no-indent. Pro výkonnější filtrování JSON v terminálu zvažte jq — ale python -m json.tool pokryje případ formátování bez jakýchkoli dalších závislostí.

Pokud nejste u terminálu vůbec — vkládáte odpověď z Postmanu nebo log soubor — JSON Formatter od ToolDeck umožňuje vložit, naformátovat a zkopírovat v jednom kroku se zvýrazněním syntaxe a validací.

Alternativní knihovny: orjson a rich

orjson — 5–10× rychlejší s nativní podporou typů

Standardní modul json je dostatečně rychlý pro většinu případů, ale pokud serializujete tisíce objektů za sekundu — v logovacích pipelinech, vysoce výkonných API, velkých datových exportech — orjson je 5–10× rychlejší. Také nativně zpracovává typy, které standardní knihovna nemůže serializovat bez vlastní funkce default: datetime, uuid.UUID, numpy pole a dataclassy.

bash — instalace
pip install orjson
Python 3.8+
import orjson
from datetime import datetime, timezone
import uuid

event = {
    "event_id": uuid.uuid4(),                  # str() není potřeba — orjson zpracuje UUID
    "timestamp": datetime.now(timezone.utc),   # isoformat() není potřeba
    "service": "auth-service",
    "level": "INFO",
    "payload": {
        "user_id": "usr_9f3a2b",
        "action": "login",
        "ip": "192.168.1.42",
        "latency_ms": 34
    }
}

# orjson.dumps vrací bytes; .decode() převede na str
print(orjson.dumps(event, option=orjson.OPT_INDENT_2).decode())
# {
#   "event_id": "a3f1c2d4-e5b6-7890-abcd-ef1234567890",
#   "timestamp": "2024-05-01T10:30:00+00:00",
#   "service": "auth-service",
#   ...
# }

Dvě věci k zapamatování: orjson.dumps() vrací bytes, nikoli řetězec — zavolejte .decode() pokud potřebujete řetězec. Podporuje pouze 2-mezerné odsazení přes OPT_INDENT_2; pro 4-mezerný výstup použijte standardní json.dumps(indent=4).

rich — zvýraznění syntaxe v terminálu

Pokud pravidelně prohlížíte JSON v terminálu nebo REPL, rich renderuje barevně zvýrazněný výstup, který zpřehledňuje hluboce vnořené struktury na první pohled. Klíče, řetězce, čísla a booleany dostávají odlišné barvy — mnohem snazší ke čtení než zeď jednobarevného textu. Je to ladící nástroj, nikoli pro produkční serializaci.

bash — instalace
pip install rich
Python 3.8+
from rich import print_json
import json

# print_json() přijímá JSON řetězec
raw = '{"event":"login","user_id":"usr_9f3a2b","timestamp":"2024-05-01T10:30:00Z","success":true,"meta":{"ip":"192.168.1.42","attempts":1}}'
print_json(raw)

# Pro hezký výpis slovníku Pythonu nejprve převeďte na řetězec
data = {
    "status": "success",
    "count": 42,
    "tags": ["python", "api", "backend"]
}
print_json(json.dumps(data))
Varování:rich.print_json() vypisuje ANSI escape kódy pro barvy terminálu — nikdy tento výstup nezachycujte a nezapisujte ho do .json souboru ani ho neposílejte jako API odpověď. Pro jakýkoli strojově čitelný výstup používejte json.dumps(indent=4).

simplejson — náhrada stdlib se zachováním kompatibility

simplejson je knihovna, která se stala standardním modulem json Pythonu — stále je udržována nezávisle a předbíhá stdlib v drobných funkcích. Je to skutečná náhrada: zaměňte import a zbytek kódu zůstane nezměněn. Užitečná, když potřebujete podporu Decimal bez vlastního encoderu, nebo při cílení na starší prostředí Pythonu.

bash — instalace
pip install simplejson
Python 3.8+
import simplejson as json  # identical API to the stdlib
from decimal import Decimal

order = {
    "item": "API subscription",
    "price": Decimal("49.99"),   # stdlib json raises TypeError here
    "quantity": 3,
}

# simplejson serializuje Decimal nativně — default= není potřeba
print(json.dumps(order, indent=4, use_decimal=True))
# {
#     "item": "API subscription",
#     "price": 49.99,
#     "quantity": 3
# }
Poznámka:Pro čistý výkon je orjson lepší volba. Sáhněte po simplejson, když potřebujete nativní serializaci Decimal bez psaní vlastního encoderu, nebo při práci s kódem, který ho již používá.

Zpracování velkých JSON souborů bez vyčerpání paměti

json.load() čte celý soubor do paměti, než máte přístup k jedinému poli. Na souboru s miliony záznamů nebo payloadu přes gigabajt to způsobí MemoryError — nebo v nejlepším případě přinutí proces přejít na swap a zpomalit se.

Streamování s ijson

ijson je streamovací JSON parser, který generuje položky po jedné ze souborového objektu. Iterujete přes prvky pole, aniž byste kdy drželi celou datovou sadu v paměti — špičková spotřeba paměti zůstává úměrná jednomu objektu, nikoli velikosti souboru.

bash — instalace
pip install ijson
Python 3.8+
import ijson
from decimal import Decimal

# events.json struktura: {"events": [...miliony objektů...]}
total_revenue = Decimal("0")
login_count = 0

with open("events.json", "rb") as f:   # ijson vyžaduje binární mód
    for event in ijson.items(f, "events.item"):
        if event.get("type") == "purchase":
            total_revenue += Decimal(str(event["amount_usd"]))
        elif event.get("type") == "login":
            login_count += 1

print(f"Revenue: ${total_revenue:.2f}  |  Logins: {login_count}")
# Zpracuje soubor 2 GB s ~30 MB špičkové spotřeby paměti
Poznámka:Přepněte z json.load() na ijson, když váš soubor překročí přibližně 50–100 MB. Pod tímto prahem je json.load() jednodušší a výrazně rychlejší, protože interně používá C-extension parser. Nad 100 MB úspora paměti ze streamování převáží dodatečnou režii.

NDJSON — jeden JSON objekt na řádek

NDJSON (Newline Delimited JSON, také nazývaný JSON Lines nebo .jsonl) ukládá jeden kompletní JSON objekt na řádek. Exportéry logů, Kafka konzumenti a datové pipeliny tento formát často produkují, protože každý řádek lze přidat a číst nezávisle — není potřeba parsovat celý soubor pro přidání záznamu. Standardní knihovna to zvládá bez dalších závislostí.

Python 3.8+
import json
from pathlib import Path

# Zápis NDJSON — jedna událost na řádek
events = [
    {"ts": "2024-05-01T10:00:00Z", "user": "usr_9f3a2b", "action": "login"},
    {"ts": "2024-05-01T10:01:03Z", "user": "usr_9f3a2b", "action": "purchase", "sku": "pro-plan"},
    {"ts": "2024-05-01T10:15:42Z", "user": "usr_4ab1d9", "action": "login"},
]

with open("events.ndjson", "w", encoding="utf-8") as f:
    for event in events:
        f.write(json.dumps(event, ensure_ascii=False) + "\n")

# Čtení NDJSON — konstantní paměť bez ohledu na velikost souboru
purchase_count = 0
with open("events.ndjson", "r", encoding="utf-8") as f:
    for line in f:
        line = line.strip()
        if not line:           # přeskočit prázdné řádky
            continue
        event = json.loads(line)
        if event.get("action") == "purchase":
            purchase_count += 1
            print(f"{event['ts']} — {event['user']} bought {event['sku']}")

Běžné chyby

Tyto čtyři chyby vidím téměř v každém code review zahrnujícím JSON serializaci — zejména u vývojářů přicházejících z JavaScriptu, kde JSON.stringify zpracovává kódování automaticky.

Použití print(data) místo json.dumps()

Problém: print() na slovníku používá Python repr — výstup zobrazuje True/None (syntaxe Pythonu), nikoli true/null (syntaxe JSON). Není to platné JSON.

Řešení: Vždy používejte json.dumps(data, indent=4) pro platný, čitelný JSON výstup.

Before · Python
After · Python
data = {"active": True, "count": None}
print(data)
# {'active': True, 'count': None}
print(json.dumps(data, indent=4))
# {
#     "active": true,
#     "count": null
# }
Zapomenutý ensure_ascii=False s non-ASCII textem

Problém: Speciální znaky (diakritika, CJK, emoji) se escapují na sekvence \\uXXXX, čímž je výstup nečitelný.

Řešení: Předejte ensure_ascii=False pro zachování původních Unicode znaků.

Before · Python
After · Python
user = {"name": "Jan Novák"}
json.dumps(user, indent=2)
# {"name": "Jan Nov\u00e1k"}
json.dumps(user, indent=2, ensure_ascii=False)
# {"name": "Jan Novák"}
Použití json.dumps() pro zápis do souboru

Problém: json.dumps() vrací řetězec; pak potřebujete samostatné volání f.write(), které vytváří zbytečný mezilehlý řetězec.

Řešení: Použijte json.dump(data, f, indent=4) — zapisuje přímo do souborového objektu.

Before · Python
After · Python
with open("out.json", "w") as f:
    f.write(json.dumps(data, indent=4))
with open("out.json", "w", encoding="utf-8") as f:
    json.dump(data, f, indent=4, ensure_ascii=False)
Hezký tisk pomocí pprint s očekáváním platného JSON

Problém: pprint.pprint() používá syntaxi Pythonu (True, None, jednoduché uvozovky), kterou JSON parsery odmítají.

Řešení: Pro jakýkoli výstup, který musí být parsovatelný jako JSON, použijte json.dumps(indent=4).

Before · Python
After · Python
import pprint
pprint.pprint({"running": True, "last_error": None})
# {'running': True, 'last_error': None}
import json
print(json.dumps({"running": True, "last_error": None}, indent=4))
# {"running": true, "last_error": null}

Srovnání metod — json.dumps, orjson, simplejson, rich

Používejte json.dumps() pro každodenní formátování a zápisy do souborů — pokryje 95 % případů bez závislostí. Sáhněte po orjson při serializaci na horké cestě nebo když vaše objekty zahrnují pole datetime a UUID. Použijte simplejson když potřebujete kompatibilitu se stdlib a podporu Decimal hned z krabice. Vyhraďte rich.print_json() a pprint výhradně pro lokální inspekci v terminálu — ani jeden neprodukuje strojově čitelný výstup.

Metoda
Výstup
Platné JSON
Rychlost
Non-ASCII
Vlastní typy
Instalace
json.dumps(indent=4)
String
Standardní
ensure_ascii=False
default= / JSONEncoder
Vestavěno
json.dump(f, indent=4)
Soubor
Standardní
ensure_ascii=False
default= / JSONEncoder
Vestavěno
pprint.pprint()
Python repr
Standardní
Nativně
✅ (jakýkoli repr)
Vestavěno
orjson.dumps(OPT_INDENT_2)
Bytes
5–10× rychlejší
Nativně
datetime, UUID, numpy
pip install orjson
python -m json.tool
CLI stdout
Standardní
Vestavěno
simplejson.dumps()
String
~1.5× rychlejší
ensure_ascii=False
Decimal nativně
pip install simplejson
rich.print_json()
Pouze terminál
✅ (vstup)
Standardní
pip install rich

Nejčastější dotazy

Jak v Pythonu hezky vytisknout JSON s odsazením?

Zavolejte json.dumps(data, indent=4). Parametr indent nastavuje počet mezer na každou úroveň vnoření. Nejprve importujte modul json — je součástí standardní knihovny Pythonu, žádný pip install není potřeba. Předejte ensure_ascii=False, pokud vaše data obsahují non-ASCII znaky jako diakritiku, znaky CJK nebo emoji.

python
import json

user = {"username": "jnovak", "plan": "enterprise", "permissions": ["read", "write", "deploy"]}
print(json.dumps(user, indent=4))

Jaký je rozdíl mezi json.dumps() a json.dump()?

json.dumps() (s "s") vrací formátovaný řetězec v paměti. json.dump() (bez "s") zapisuje přímo do souborového objektu — předejte otevřený souborový handle jako druhý argument. Pro zápis formátovaného JSON na disk je idiomatické json.dump(data, f, indent=4), které se vyhne vytváření mezilehlého řetězce.

python
# dumps → řetězec v paměti
formatted = json.dumps(data, indent=4)

# dump → zápis přímo do souboru
with open('output.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, indent=4)

Proč json.dumps() zobrazuje \u010d\u0161\u017e místo skutečných znaků?

Ve výchozím nastavení ensure_ascii=True escapuje každý non-ASCII znak na sekvenci \uXXXX. Nastavte ensure_ascii=False pro zachování původních Unicode znaků. To je zvláště důležité pro jména, adresy a veškerý uživatelem generovaný obsah v nelatinském písmu.

python
data = {"city": "Praha", "sample": "příliš žluťoučký kůň"}

# Výchozí — escapováno
json.dumps(data, indent=4)
# {"city": "Praha", "sample": "p\u0159\u00edli\u0161 \u017elu\u0165ou\u010dk\u00fd k\u016f\u0148"}

# Čitelně
json.dumps(data, indent=4, ensure_ascii=False)
# {"city": "Praha", "sample": "příliš žluťoučký kůň"}

Jak hezky vytisknout JSON řetězec (ne slovník)?

Nejprve parsujte řetězec pomocí json.loads(), pak ho formátujte pomocí json.dumps(). Obě volání lze zřetězit na jeden řádek pro rychlou inspekci v terminálu.

python
import json

raw = '{"endpoint":"/api/v2/users","timeout":30,"retry":true}'
print(json.dumps(json.loads(raw), indent=4))

Mohu použít pprint pro formátování JSON v Pythonu?

pprint.pprint() produkuje reprezentaci objektu Pythonu, nikoli platný JSON. Používá True/False/None (syntaxe Pythonu) místo true/false/null (syntaxe JSON). Nikdy nepředávejte výstup pprint do API nebo JSON parseru — pro cokoli, co musí být platné JSON, použijte json.dumps(indent=4).

python
import pprint, json

data = {"active": True, "score": None}

pprint.pprint(data)     # {'active': True, 'score': None}  ← není JSON
json.dumps(data, indent=4)  # {"active": true, "score": null}  ← platné JSON

Jak v Pythonu seřadit klíče JSON abecedně?

Přidejte sort_keys=True do json.dumps(). Pro příkazový řádek použijte python -m json.tool --sort-keys data.json. Seřazené klíče zpřehledňují JSON diffy a pomáhají na první pohled rozpoznat změněné hodnoty.

python
import json

server = {"workers": 4, "host": "0.0.0.0", "port": 8080, "debug": False}
print(json.dumps(server, indent=4, sort_keys=True))
# {
#     "debug": false,
#     "host": "0.0.0.0",
#     "port": 8080,
#     "workers": 4
# }

Python vám dává plnou kontrolu — vlastní serializátory, streaming, integrace pipeline. Když potřebujete jen zkontrolovat nebo sdílet formátovaný fragment, JSON Formatter od ToolDeck je rychlejší cesta: vložte JSON a získejte odsazený výsledek se zvýrazněním bez jakéhokoli nastavení prostředí.

Podobné nástroje

Dostupné také v:GoJavaScriptBash
MS
Maria SantosBackend Developer

Maria is a backend developer specialising in Python and API integration. She has broad experience with data pipelines, serialisation formats, and building reliable server-side services. She is an active member of the Python community and enjoys writing practical, example-driven guides that help developers solve real problems without unnecessary theory.

DV
Dmitri VolkovTechnický recenzent

Dmitri is a DevOps engineer who relies on Python as his primary scripting and automation language. He builds internal tooling, CI/CD pipelines, and infrastructure automation scripts that run in production across distributed teams. He writes about the Python standard library, subprocess management, file processing, encoding utilities, and the practical shell-adjacent Python that DevOps engineers use every day.