JSON Formatter Python — Průvodce json.dumps()
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.
- →
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=Falsekdykoli vaše data obsahují diakritiku, znaky CJK nebo emoji. - →Pro
datetime,UUIDnebo vlastní třídy použijte parametrdefault=nebo podtřiďtejson.JSONEncoder. - →
separators=(',', ':')odstraní veškeré mezery — použijte pro síťový přenos nebo vkládání do URL. - →
orjsonje 5–10× rychlejší než stdlib a nativně podporujedatetimeauuid.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
ijsonmístojson.load(), abyste předešliMemoryError.
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.
{"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.
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é):
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"
# }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.
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.
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"}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.
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 TypeErrorPří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.
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.
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=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í.
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:00object_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.
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
# }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
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
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")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.
# 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--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.
pip install orjson
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.
pip install rich
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))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.
pip install simplejson
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
# }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.
pip install ijson
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ětijson.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í.
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.
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.
data = {"active": True, "count": None}
print(data)
# {'active': True, 'count': None}print(json.dumps(data, indent=4))
# {
# "active": true,
# "count": null
# }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ů.
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"}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.
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)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).
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.
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.
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.
# 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.
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.
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).
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é JSONJak 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.
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
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.
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.