JSON Formatter Python — json.dumps() Rehberi

·Backend Developer·İnceleyenDmitri Volkov·Yayınlandı

Ücretsiz JSON Formatlayıcı ve Güzelleştirici aracını doğrudan tarayıcınızda kullanın — kurulum gerektirmez.

JSON Formatlayıcı ve Güzelleştirici Online Dene →

Python API istemcisini hata ayıklarken ilk başvurduğum şey python json güzel yazdırma — bir tek json.dumps(data, indent=4) çağrısıyla okunaksız tek satırlık bir blob anında gezilebilir hale gelir. Python'ın dahili json modülü bunu tamamen standart kütüphanede halleder — üçüncü taraf kurulum gerekmez. Kod yazmadan hızlı bir sonuç almanız gerekiyorsa ToolDeck'in JSON Formatter bunu anında yapar. Bu kılavuz tüm pratik yöntemleri kapsar: json.dumps() tüm parametreleriyle, pprint, yüksek performanslı biçimlendirme için orjson, json.tool CLI, datetime ve UUID gibi özel türleri serileştirme, ijson ile gigabayt ölçekli dosyaları akış olarak işleme ve rich ile terminal sözdizimi vurgulama — hepsi Python 3.8+ uyumlu kodla.

Temel Çıkarımlar
  • json.dumps(data, indent=4) Python'ın stdlib'ine 2.6'dan beri dahildir — kurulum gerekmez.
  • Veriniz aksan harfler, CJK karakterleri veya emoji içerdiğinde ensure_ascii=False geçin.
  • datetime, UUID veya özel sınıflar için default= parametresini kullanın ya da json.JSONEncoder'ı alt sınıflayın.
  • separators=(',', ':') tüm boşlukları kaldırır — ağ aktarımı veya URL gömme için kullanın.
  • orjson stdlib'den 5–10× daha hızlıdır ve datetime ile uuid.UUID'ı doğal olarak işler.
  • pprint.pprint() Python sözdizimi (True/None) üretir, geçerli JSON değil — dosyalar veya API yanıtları için asla kullanmayın.
  • 50 MB'tan büyük JSON dosyaları için MemoryError'dan kaçınmak adına json.load() yerine ijson ile akış kullanın.

JSON Güzel Yazdırma Nedir?

Güzel yazdırma, yoğun ve küçültülmüş bir JSON dizesini tutarlı girinti ve satır sonlarıyla insan tarafından okunabilir bir biçime dönüştürür. Dönüşüm tamamen görseldir: veriler aynıdır, yalnızca sunum değişir. Python'ın json modülü bunu tamamen standart kütüphanede halleder — kurulacak bir şey yoktur.

Before · json
After · json
{"id":"usr_9f3a2b","name":"Ahmet Yılmaz","roles":["admin","editor"],"prefs":{"theme":"dark","lang":"tr"}}
{
    "id": "usr_9f3a2b",
    "name": "Ahmet Yılmaz",
    "roles": [
        "admin",
        "editor"
    ],
    "prefs": {
        "theme": "dark",
        "lang": "tr"
    }
}

json.dumps() — JSON Biçimlendirmenin Standart Yolu

json.dumps() Python 2.6'dan beri Python'ın standart kütüphanesinin bir parçasıdır — yalnızca import json yapın, ek kurulum gerekmez. JSON uyumlu herhangi bir Python nesnesini biçimlendirilmiş bir dizeye serileştirir. Temel parametre indent'tir: okunabilir çıktı için 4 (veya 2) olarak ayarlayın.

Python 3.8+ — minimal örnek
import json

kullanici = {
    "id": "usr_9f3a2b",
    "name": "Ahmet Yılmaz",
    "roles": ["admin", "editor"],
    "prefs": {"theme": "dark", "lang": "tr"}
}

print(json.dumps(kullanici, indent=4, ensure_ascii=False))
# Çıktı:
# {
#     "id": "usr_9f3a2b",
#     "name": "Ahmet Yılmaz",
#     "roles": [
#         "admin",
#         "editor"
#     ],
#     "prefs": {
#         "theme": "dark",
#         "lang": "tr"
#     }
# }

Üretim kullanımı için çoğunlukla sort_keys=True (çalıştırmalar arası tutarlı çıktı) ve ensure_ascii=False (Türkçe karakterleri koru) kullanmak isteyeceksiniz:

Python 3.8+ — sort_keys ve ensure_ascii ile
import json

api_yaniti = {
    "timestamp": "2024-05-01T10:30:00Z",
    "durum": "basarili",
    "veri": {
        "user_id": "usr_9f3a2b",
        "ad_soyad": "Zeynep Kaya",
        "sehir": "İstanbul",
        "puan": 4892.5,
        "etiketler": ["python", "backend", "api"]
    }
}

print(json.dumps(api_yaniti, indent=4, sort_keys=True, ensure_ascii=False))
# Çıktı (anahtarlar sıralı, Türkçe karakterler korunmuş):
# {
#     "durum": "basarili",
#     "timestamp": "2024-05-01T10:30:00Z",
#     "veri": {
#         "ad_soyad": "Zeynep Kaya",
#         "etiketler": ["api", "backend", "python"],
#         "puan": 4892.5,
#         "sehir": "İstanbul",
#         "user_id": "usr_9f3a2b"
#     }
# }
Not:json.dumps()bir dize döndürür. Biçimlendirilmiş JSON'ı doğrudan bir dosyaya yazmak için json.dump(data, f, indent=4) kullanın (s olmadan) — bir dosya nesnesine yazar ve bellekte ara dize oluşturmaktan kaçınır.

json.dumps() Parametre Başvurusu

Nesnenin kendisi dışındaki tüm parametreler isteğe bağlıdır. Varsayılan değerler kompakt, ASCII güvenli JSON üretir — insan tarafından okunabilir çıktı için parametreleri açıkça geçin.

Parametre
Tür
Varsayılan
Açıklama
obj
any
JSON biçimli dizeye dönüştürülecek Python nesnesi.
indent
int | str | None
None
Girinti düzeyi başına boşluk sayısı. None = tek satır kompakt, 0 = yalnızca satır sonları, 4 = standart.
sort_keys
bool
False
Sözlük anahtarlarını tüm iç içe düzeylerde alfabetik olarak sıralar.
ensure_ascii
bool
True
ASCII dışı karakterleri \uXXXX olarak kaçışlar. Unicode karakterleri korumak için False geçin.
separators
tuple | None
None
(öğe_sep, anahtar_sep) çifti. Boşluksuz en kompakt çıktı için (",", ":") kullanın.
default
callable | None
None
Varsayılan olarak serileştirilemeyen türler için çağrılır. Değeri reddetmek için TypeError fırlatın.
allow_nan
bool
True
float("nan") ve float("inf") değerlerini JS değişmezleri olarak serileştirir. ValueError için False geçin.

separators Parametresiyle Kompakt JSON Çıktısı

Varsayılan olarak json.dumps() öğeleri ", " ile, anahtarları değerlerden ": " ile ayırır. separators parametresi her ikisini de geçersiz kılar. (',', ':') geçmek tüm boşlukları kaldırarak mümkün olan en kompakt geçerli JSON'ı üretir — ağ aktarımı, URL gömme veya her baytın önemli olduğu veritabanı sütunlarında JSON depolama için kullanışlıdır.

Python 3.8+
import json

yuklem = {
    "endpoint": "/api/v2/olaylar",
    "filtreler": {"durum": "aktif", "limit": 100},
    "siralama": "desc"
}

# Varsayılan — ayırıcılardan sonra boşluklar (okunabilir)
varsayilan_cikti = json.dumps(yuklem, ensure_ascii=False)
# {"endpoint": "/api/v2/olaylar", "filtreler": {"durum": "aktif", "limit": 100}, "siralama": "desc"}
# len = 88

# Kompakt — hiç boşluk yok
kompakt_cikti = json.dumps(yuklem, separators=(',', ':'), ensure_ascii=False)
# {"endpoint":"/api/v2/olaylar","filtreler":{"durum":"aktif","limit":100},"siralama":"desc"}
# len = 80  (9% daha küçük; tasarruf daha büyük yüklemlerde artar)

# Kompakt + yeniden üretilebilir önbellek anahtarları için sıralı anahtarlar
kanonik = json.dumps(yuklem, separators=(',', ':'), sort_keys=True, ensure_ascii=False)
print(kanonik)
# {"endpoint":"/api/v2/olaylar","filtreler":{"durum":"aktif","limit":100},"siralama":"desc"}
Not:indent= ile birlikte separators= geçildiğinde, separators argümanı yalnızca satır içi ayırıcıları kontrol eder — indent'ten gelen satır sonları ve girintiler korunur. Kompakt tek satır çıktı istiyorsanız indent'i atlayın (veya None geçin) ve separators=(',', ':') ayarlayın.

default Parametresiyle Özel Python Nesnelerini Serileştirme

Standart json modülü dict, liste, dize, sayı, boolean ve None'ı serileştirir — ancak başka herhangi bir tür için TypeError fırlatır. Üretim kodundaki en yaygın iki sorun datetime nesneleri ve UUID'lerdir.

Python 3.8+ — özel işleme olmadan TypeError
import json
from datetime import datetime, timezone
import uuid

siparis = {
    "siparis_id": uuid.uuid4(),            # ❌ TypeError: UUID is not JSON serializable
    "olusturulma": datetime.now(timezone.utc),  # ❌ TypeError: datetime is not JSON serializable
    "toplam_tl": 142.50,
    "urunler": ["pro-abonelik", "depolama-eklentisi"]
}

json.dumps(siparis)  # TypeError fırlatır

Yaklaşım 1 — default= parametresi

default='a bir çağrılabilir geçin. json.dumps() işleyemediği herhangi bir nesne için onu çağırır. Serileştirilebilir bir temsil döndürün ya da açıkça desteklemediğiniz türler için TypeError fırlatın — bilinmeyenleri asla sessizce yutmayın.

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

def json_varsayilan(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(obj).__name__!r} türü JSON serileştirilebilir değil")

siparis = {
    "siparis_id": uuid.uuid4(),
    "olusturulma": datetime(2024, 5, 1, 10, 30, 0, tzinfo=timezone.utc),
    "toplam_tl": Decimal("142.50"),
    "urunler": ["pro-abonelik", "depolama-eklentisi"]
}

print(json.dumps(siparis, indent=4, default=json_varsayilan, ensure_ascii=False))
# {
#     "siparis_id": "a3f1c2d4-e5b6-7890-abcd-ef1234567890",
#     "olusturulma": "2024-05-01T10:30:00+00:00",
#     "toplam_tl": 142.5,
#     "urunler": ["pro-abonelik", "depolama-eklentisi"]
# }

Yaklaşım 2 — json.JSONEncoder alt sınıfı

Birden fazla modül arasında paylaşılan yeniden kullanılabilir kodlama mantığı için json.JSONEncoder'ı alt sınıflamak, her yere bir default fonksiyonu geçirmekten daha temizdir. default metodunu geçersiz kılın ve son yedek olarak super().default(obj) çağrısı yapın — bu, desteklenmeyen türler için doğru hata davranışını korur.

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

class UygulamaEncoder(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)  # bilinmeyen türler için TypeError fırlatır

siparis = {
    "siparis_id": uuid.uuid4(),
    "olusturulma": datetime(2024, 5, 1, 10, 30, 0, tzinfo=timezone.utc),
    "toplam_tl": Decimal("142.50"),
}

# Encoder sınıfını cls= ile geçin
print(json.dumps(siparis, indent=4, cls=UygulamaEncoder, ensure_ascii=False))
# default= yaklaşımıyla aynı çıktı
Not:Tanınmayan türler için her zaman super().default(obj) çağrısı yapın (veya açıkça TypeError fırlatın). Her şey için sessizce str(obj) döndürmek, hata fırlatması gereken nesneleri bozar — üretimde izlemesi zor bir hata.

Geri çözme — object_hook

Kodlama yalnızca hikayenin yarısıdır. JSON'dan özel bir Python nesnesini yeniden oluşturmak için json.loads() veya json.load()'a bir object_hook fonksiyonu geçirin. Hook, her çözülmüş JSON nesnesi (dict) için çağrılır ve yerine herhangi bir Python değeri döndürebilir — tam bir kodlama ↔ çözme döngüsü sağlar.

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

@dataclass
class Olay:
    ad: str
    gerceklestigi_an: datetime
    user_id: str

def olayi_kodla(obj):
    if isinstance(obj, Olay):
        return {
            "__tur__": "Olay",
            "ad": obj.ad,
            "gerceklestigi_an": obj.gerceklestigi_an.isoformat(),
            "user_id": obj.user_id,
        }
    raise TypeError(f"{type(obj)} serileştirilemiyor")

def olayi_coz(d):
    if d.get("__tur__") == "Olay":
        return Olay(
            ad=d["ad"],
            gerceklestigi_an=datetime.fromisoformat(d["gerceklestigi_an"]),
            user_id=d["user_id"],
        )
    return d

# Kodla
olay = Olay("giris", datetime(2024, 5, 1, 10, 30), "usr_9f3a2b")
json_str = json.dumps(olay, default=olayi_kodla, indent=4)

# Olay örneğine geri çöz
geri_yuklendi = json.loads(json_str, object_hook=olayi_coz)
print(type(geri_yuklendi))           # <class 'Olay'>
print(geri_yuklendi.gerceklestigi_an)  # 2024-05-01 10:30:00
Not:object_hook belgede yalnızca üst düzey değil, iç içe geçmiş her dict için çağrılır. Hookun özel nesnelerinizi olduğu gibi bırakılması gereken düz dictlerden ayırt edebilmesi için bir ayrıştırıcı alan (örneğin "__tur__") ekleyin.

pprint — Alternatif Modül (ve Ne Zaman Kullanılmaz)

Python'ın pprint modülü (güzel yazıcı) Python veri yapılarını terminalde okunabilirlik için biçimlendirir. Ayrıştırılmış Python nesneleri üzerinde çalışır, JSON dizelerinde değil — ve çıktısı JSON sözdizimi değil Python sözdizimini kullanır.

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 — geçerli Python repr, geçerli JSON DEĞİL
pprint.pprint(data, sort_dicts=False)
# {'sensor_id': 's-441',
#  'readings': [23.1, 23.4, 22.9],
#  'unit': 'celsius',
#  'active': True}        ← Python True, JSON true değil

# json.dumps — geçerli JSON
print(json.dumps(data, indent=4))
# {
#     "sensor_id": "s-441",
#     "readings": [23.1, 23.4, 22.9],
#     "unit": "celsius",
#     "active": true      ← geçerli JSON
# }
Uyarı:pprint çıktısını asla bir API uç noktasına göndermeyin ya da bir .json dosyasına yazmayın — standart sözdizimi bekleyen herhangi bir JSON ayrıştırıcısını bozar. Geçerli JSON olması gereken tüm çıktılar için json.dumps(indent=4) kullanın.

pprint'in mantıklı olduğu durumlar: REPL'de veya hata ayıklama günlüğünde Python nesnelerinin hızlı terminal incelemesi, özellikle nesne JSON serileştirilemez türler içerdiğinde (kümeler, özel sınıf örnekleri, dönüşüm öncesi dataclass'lar).

Requests'ten Gelen JSON Yanıtını Nasıl Güzel Yazdırırım

En yaygın gerçek dünya senaryosu: diskte bir JSON dosyanız veya bir API'den gelen HTTP yanıtınız var ve bunu hata ayıklama ya da günlükleme için biçimlendirmek istiyorsunuz. Her iki durumda da aynı yaklaşım kullanılır — Python dict'ine ayrıştırın, ardından json.dumps() ile biçimlendirin.

Dosyadan okuma

Python 3.8+
import json

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

    # Konsola güzel yazdır
    print(json.dumps(data, indent=4, ensure_ascii=False))

    # Ya da biçimlendirilmiş sürümü diske geri yaz
    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"Geçersiz JSON: {e}")
except FileNotFoundError:
    print(f"Dosya bulunamadı: config.json")

API yanıtını biçimlendirme

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

def api_guzel_yazdir(url: str) -> None:
    try:
        yanit = requests.get(url, timeout=10)
        yanit.raise_for_status()
        print(json.dumps(yanit.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"Ağ hatası: {e}")
    except json.JSONDecodeError:
        print(f"Yanıt gövdesi JSON değil:\n{yanit.text[:500]}")

api_guzel_yazdir("https://api.github.com/repos/python/cpython")
Not:response.json() yanıt gövdesini zaten ayrıştırır — ayrıca json.loads() çağrısı yapmanıza gerek yoktur. Kafa karıştırıcı bir ayrıştırma hatasına neden olmadan önce 4xx/5xx hatalarını yakalamak için .json()'a erişmeden önce her zaman raise_for_status() ekleyin.

Komut Satırından Güzel Yazdırma

Python, json.tool ile birlikte gelir — Python betiği gerekmeden doğrudan terminalden JSON biçimlendirmek için bir CLI modülü. Python yüklü herhangi bir makinede kullanılabilir.

bash
# Yerel dosyayı biçimlendir
python -m json.tool config.json

# API yanıtını biçimleyici üzerinden aktar
curl -s https://api.github.com/users/gvanrossum | python -m json.tool

# stdin'den biçimlendir
echo '{"servis":"api-gateway","versiyon":"2.1.0","saglikli":true}' | python -m json.tool

# Anahtarları alfabetik sırala
python -m json.tool --sort-keys data.json

# Özel girinti (Python 3.9+)
python -m json.tool --indent 2 data.json
Not:Python 3.9, --indent ve --no-indent bayraklarını ekledi. Daha güçlü terminal JSON filtreleme için jq'yu düşünebilirsiniz — ancak python -m json.tool sıfır ek bağımlılıkla biçimlendirme kullanım durumunu karşılar.

Hiç terminalde değilseniz — Postman yanıtı veya log dosyası yapıştırıyorsanız — ToolDeck JSON Formatter yerleşik sözdizimi vurgulama ve doğrulama ile yapıştırma, formatlama ve kopyalamayı tek adımda yapmanıza olanak tanır.

Alternatif Kütüphaneler: orjson ve rich

orjson — Doğal Tür Desteğiyle 5–10× Daha Hızlı

Standart json modülü çoğu kullanım durumu için yeterince hızlıdır, ancak saniyede binlerce nesne serileştiriyorsanız — günlük ardışık düzenleri, yüksek verimli API'ler, büyük veri dışa aktarmaları — orjson 5–10× daha hızlıdır. Ayrıca standart kütüphanenin özel bir default fonksiyonu olmadan serileştiremediği türleri doğal olarak işler: datetime, uuid.UUID, numpy dizileri ve dataclass'lar.

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

olay = {
    "olay_id": uuid.uuid4(),                   # str() gerekmez — orjson UUID'yi işler
    "timestamp": datetime.now(timezone.utc),   # isoformat() gerekmez
    "servis": "auth-service",
    "seviye": "INFO",
    "yuklem": {
        "user_id": "usr_9f3a2b",
        "eylem": "giris",
        "ip": "192.168.1.42",
        "gecikme_ms": 34
    }
}

# orjson.dumps bytes döndürür; .decode() str'ye dönüştürür
print(orjson.dumps(olay, option=orjson.OPT_INDENT_2).decode())
# {
#   "olay_id": "a3f1c2d4-e5b6-7890-abcd-ef1234567890",
#   "timestamp": "2024-05-01T10:30:00+00:00",
#   "servis": "auth-service",
#   ...
# }

Bilinmesi gereken iki şey: orjson.dumps() dize değil bytes döndürür — dize gerekiyorsa .decode() çağrısı yapın. OPT_INDENT_2 aracılığıyla yalnızca 2 boşluk girintiyi destekler; 4 boşluk çıktı için standart json.dumps(indent=4) kullanın.

rich — Terminalde Sözdizimi Vurgulama

Terminalde veya REPL'de düzenli olarak JSON inceliyorsanız, rich derin iç içe yapıları bir bakışta okunabilir kılan renkli, sözdizimi vurgulu çıktı üretir. Anahtarlar, dizeler, sayılar ve booleanlar her biri farklı bir renk alır — tek renkli bir metin duvarından çok daha kolay taranır. Yalnızca hata ayıklama zamanı bir araçtır, üretim serileştirmesi için değildir.

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

# print_json() bir JSON dizesi kabul eder
raw = '{"olay":"giris","user_id":"usr_9f3a2b","timestamp":"2024-05-01T10:30:00Z","basarili":true,"meta":{"ip":"192.168.1.42","denemeler":1}}'
print_json(raw)

# Python dict'ini güzel yazdırmak için önce dizeye dönüştürün
veri = {
    "durum": "basarili",
    "sayi": 42,
    "etiketler": ["python", "api", "backend"]
}
print_json(json.dumps(veri, ensure_ascii=False))
Uyarı:rich.print_json() terminal rengi için ANSI kaçış kodları çıktılar — bu çıktıyı asla yakalayıp bir .json dosyasına yazmayın veya API yanıtı olarak göndermeyin. Makine tarafından okunabilir herhangi bir çıktı için json.dumps(indent=4) kullanın.

simplejson — Doğrudan Uyumlu stdlib Değiştirmesi

simplejson, Python'ın standart json modülüne dönüşen kütüphanedir — bağımsız olarak korunmaya devam eder ve küçük özelliklerde stdlib'nin önünde kalır. Gerçek bir doğrudan değiştirmedir: içe aktarımı değiştirin, geri kalan kodunuz değişmez. Decimal desteğine özel bir encoder olmadan ihtiyacınız olduğunda veya daha eski Python ortamlarını hedeflediğinizde kullanışlıdır.

bash — kur
pip install simplejson
Python 3.8+
import simplejson as json  # stdlib ile aynı API
from decimal import Decimal

siparis = {
    "urun": "API aboneliği",
    "fiyat": Decimal("49.99"),   # stdlib json burada TypeError fırlatır
    "adet": 3,
}

# simplejson Decimal'i doğal olarak serileştirir — default= gerekmez
print(json.dumps(siparis, indent=4, use_decimal=True, ensure_ascii=False))
# {
#     "urun": "API aboneliği",
#     "fiyat": 49.99,
#     "adet": 3
# }
Not:Saf performans için orjson daha iyi bir seçimdir. simplejson'a özel bir encoder yazmadan doğal Decimal serileştirmesine ihtiyaç duyduğunuzda veya zaten kullanan bir kod tabanını koruduğunuzda başvurun.

Bellek Tükenmeden Büyük JSON Dosyalarını İşleme

json.load() tek bir alana erişmeden önce dosyanın tamamını belleğe okur. Milyonlarca kayıt içeren ya da bir gigabaytı aşan bir dosyada bu MemoryError'a neden olur — ya da en iyi ihtimalle sürecin takas belleğine geçmesine ve yavaşlamasına yol açar.

ijson ile akış

ijson, bir dosya nesnesinden öğeleri birer birer üreten bir akış JSON ayrıştırıcısıdır. Tam veri kümesini hiçbir zaman bellekte tutmadan dizi öğeleri üzerinde yineleme yaparsınız — zirve bellek kullanımı dosya boyutuna değil tek bir nesneyle orantılı kalır.

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

# olaylar.json yapısı: {"olaylar": [...milyonlarca nesne...]}
toplam_gelir = Decimal("0")
giris_sayisi = 0

with open("olaylar.json", "rb") as f:   # ijson ikili mod gerektirir
    for olay in ijson.items(f, "olaylar.item"):
        if olay.get("tur") == "satin_alim":
            toplam_gelir += Decimal(str(olay["tutar_tl"]))
        elif olay.get("tur") == "giris":
            giris_sayisi += 1

print(f"Gelir: {toplam_gelir:.2f} TL  |  Girişler: {giris_sayisi}")
# 2 GB'lık dosyayı ~30 MB zirve bellek kullanımıyla işler
Not:Dosyanız yaklaşık 50–100 MB'ı aştığında json.load()'dan ijson'a geçin. Bu eşiğin altında json.load()dahili olarak C uzantısı ayrıştırıcı kullandığından daha basit ve önemli ölçüde daha hızlıdır. 100 MB'ın üzerinde akıştan elde edilen bellek tasarrufu ek yükü aşar.

NDJSON — satır başına bir JSON nesnesi

NDJSON (Newline Delimited JSON, JSON Lines veya .jsonl olarak da bilinir) satır başına tam bir JSON nesnesi depolar. Günlük dışa aktarıcılar, Kafka tüketicileri ve veri ardışık düzenleri bu biçimi sıkça üretir çünkü her satır bağımsız olarak eklenip okunabilir — bir kayıt eklemek için dosyanın tamamını ayrıştırmak gerekmez. Standart kütüphane ek bağımlılık olmadan bunu işler.

Python 3.8+
import json
from pathlib import Path

# NDJSON yaz — satır başına bir olay
olaylar = [
    {"ts": "2024-05-01T10:00:00Z", "kullanici": "usr_9f3a2b", "eylem": "giris"},
    {"ts": "2024-05-01T10:01:03Z", "kullanici": "usr_9f3a2b", "eylem": "satin_alim", "sku": "pro-plan"},
    {"ts": "2024-05-01T10:15:42Z", "kullanici": "usr_4ab1d9", "eylem": "giris"},
]

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

# NDJSON oku — dosya ne kadar büyük olursa olsun sabit bellek
satin_alim_sayisi = 0
with open("olaylar.ndjson", "r", encoding="utf-8") as f:
    for satir in f:
        satir = satir.strip()
        if not satir:           # boş satırları atla
            continue
        olay = json.loads(satir)
        if olay.get("eylem") == "satin_alim":
            satin_alim_sayisi += 1
            print(f"{olay['ts']} — {olay['kullanici']} {olay['sku']} satın aldı")

Yaygın Hatalar

Bu dört hatayı neredeyse her kod incelemesinde görüyorum — özellikle JSON.stringify'ın kodlamayı otomatik olarak işlediği JavaScript'ten gelen geliştiricilerden.

json.dumps() yerine print(data) kullanmak

Sorun: Dict üzerinde print() Python repr kullanır — çıktı true/null (JSON sözdizimi) değil True/None (Python sözdizimi) gösterir. Geçerli JSON değildir.

Çözüm: Geçerli, okunabilir JSON çıktısı için her zaman json.dumps(data, indent=4) kullanın.

Before · Python
After · Python
data = {"aktif": True, "sayi": None}
print(data)
# {'aktif': True, 'sayi': None}
print(json.dumps(data, indent=4))
# {
#     "aktif": true,
#     "sayi": null
# }
ASCII dışı metinle ensure_ascii=False'u unutmak

Sorun: Türkçe karakterler, aksan harfler ve emojiler \\uXXXX dizilerine kaçışlanır; çıktı okunaksız hale gelir.

Çözüm: Orijinal Unicode karakterleri korumak için ensure_ascii=False geçin.

Before · Python
After · Python
kullanici = {"sehir": "İstanbul", "isim": "Ahmet Yılmaz"}
json.dumps(kullanici, indent=2)
# {"sehir": "\u0130stanbul", "isim": "Ahmet Y\u0131lmaz"}
json.dumps(kullanici, indent=2, ensure_ascii=False)
# {"sehir": "İstanbul", "isim": "Ahmet Yılmaz"}
Dosyaya yazmak için json.dumps() kullanmak

Sorun: json.dumps() bir dize döndürür; ayrı bir f.write() çağrısına ihtiyaç duyarsınız ve gereksiz ara dize oluşturulur.

Çözüm: json.dump(data, f, indent=4) kullanın — doğrudan dosya nesnesine yazar.

Before · Python
After · Python
with open("cikti.json", "w") as f:
    f.write(json.dumps(data, indent=4))
with open("cikti.json", "w", encoding="utf-8") as f:
    json.dump(data, f, indent=4, ensure_ascii=False)
pprint ile geçerli JSON beklentisi içinde olmak

Sorun: pprint.pprint() JSON ayrıştırıcılarının reddettiği Python sözdizimini (True, None, tek tırnak) kullanır.

Çözüm: JSON olarak ayrıştırılması gereken herhangi bir çıktı için json.dumps(indent=4) kullanın.

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

Yöntem Karşılaştırması — json.dumps, orjson, simplejson, rich

Günlük biçimlendirme ve dosya yazma için json.dumps() kullanın — sıfır bağımlılıkla kullanım durumlarının %95'ini karşılar. orjson'a sıcak bir yolda serileştirme yaparken ya da nesneleriniz datetime ve UUID alanları içerdiğinde başvurun. simplejson'ı kutudan çıkan Decimal desteğiyle doğrudan stdlib uyumluluğuna ihtiyaç duyduğunuzda kullanın. rich.print_json() ve pprint'i kesinlikle yalnızca yerel terminal incelemesi için saklayın — ikisi de makine tarafından okunabilir çıktı üretmez.

Yöntem
Çıktı
Geçerli JSON
Hız
Non-ASCII
Özel Tipler
Kurulum
json.dumps(indent=4)
Dize
Standart
ensure_ascii=False
default= / JSONEncoder
Dahili
json.dump(f, indent=4)
Dosya
Standart
ensure_ascii=False
default= / JSONEncoder
Dahili
pprint.pprint()
Python repr
Standart
Doğal
✅ (herhangi repr)
Dahili
orjson.dumps(OPT_INDENT_2)
Bytes
5–10× daha hızlı
Doğal
datetime, UUID, numpy
pip install orjson
python -m json.tool
CLI stdout
Standart
Dahili
simplejson.dumps()
Dize
~1.5× daha hızlı
ensure_ascii=False
Decimal doğal
pip install simplejson
rich.print_json()
Yalnızca terminal
✅ (girdi)
Standart
pip install rich

Sıkça Sorulan Sorular

Python'da JSON nasıl güzel yazdırılır?

json.dumps(data, indent=4) çağrısını kullanın. indent parametresi, iç içe geçme düzeyi başına boşluk sayısını belirler. Önce json modülünü içe aktarın — Python standart kütüphanesiyle birlikte gelir, pip install gerekmez. Veriniz Türkçe karakterler, aksan harfler veya CJK karakterleri içeriyorsa ensure_ascii=False geçin.

python
import json

kullanici = {"username": "ahmet.yilmaz", "plan": "enterprise", "izinler": ["okuma", "yazma", "deploy"]}
print(json.dumps(kullanici, indent=4, ensure_ascii=False))

json.dumps() ile json.dump() arasındaki fark nedir?

json.dumps() ("s" ile) bellekte biçimlendirilmiş bir dize döndürür. json.dump() ("s" olmadan) ise doğrudan dosya benzeri bir nesneye yazar — ikinci argüman olarak açık dosya tanıtıcısını geçin. Biçimlendirilmiş JSON'ı diske yazmak için json.dump(data, f, indent=4) kullanımı deyimseldir ve gereksiz ara dize oluşturmaktan kaçınır.

python
# dumps → bellekte dize
bicimlenmis = json.dumps(data, indent=4)

# dump → doğrudan dosyaya yaz
with open('cikti.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, indent=4)

json.dumps() neden gerçek karakter yerine \u015f\u015e gibi şeyler gösteriyor?

Varsayılan olarak ensure_ascii=True her ASCII dışı karakteri \uXXXX dizisine kaçışlar. Orijinal Unicode karakterleri korumak için ensure_ascii=False geçin. Bu, Türkçe karakterler, adlar, adresler ve Latin dışı alfabedeki kullanıcı içerikleri için özellikle önemlidir.

python
data = {"şehir": "İstanbul", "dil": "Türkçe", "mesaj": "Merhaba!"}

# Varsayılan — kaçışlı
json.dumps(data, indent=4)
# {"\u015fehir": "\u0130stanbul", "dil": "T\u00fcrk\u00e7e", ...}

# Okunabilir
json.dumps(data, indent=4, ensure_ascii=False)
# {"şehir": "İstanbul", "dil": "Türkçe", "mesaj": "Merhaba!"}

Bir JSON dizesini (dict değil) nasıl güzel yazdırırım?

Önce json.loads() ile dizeyi ayrıştırın, sonra json.dumps() ile biçimlendirin. Hızlı terminal incelemesi için iki çağrı tek satırda zincirlenebilir.

python
import json

ham = '{"endpoint":"/api/v2/kullanicilar","timeout":30,"yeniden_dene":true}'
print(json.dumps(json.loads(ham), indent=4))

Python'da JSON biçimlendirmek için pprint kullanabilir miyim?

pprint.pprint() Python nesne gösterimi üretir, geçerli JSON değil. true/false/null (JSON sözdizimi) yerine True/False/None (Python sözdizimi) kullanır. Pprint çıktısını asla bir API'ye veya JSON ayrıştırıcısına geçirmeyin — geçerli JSON gerektiren her şey için json.dumps(indent=4) kullanın.

python
import pprint, json

data = {"aktif": True, "puan": None}

pprint.pprint(data)        # {'aktif': True, 'puan': None}  ← JSON değil
json.dumps(data, indent=4) # {"aktif": true, "puan": null}  ← geçerli JSON

Python'da JSON anahtarlarını alfabetik olarak nasıl sıralarım?

json.dumps() çağrısına sort_keys=True ekleyin. Komut satırında python -m json.tool --sort-keys data.json kullanın. Sıralı anahtarlar JSON farkları okunabilir kılar ve sürümler arasında neyin değiştiğini bir bakışta görmenizi sağlar.

python
import json

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

Python size tam kontrol sağlar — özel serializerlar, streaming, pipeline entegrasyonu. Yalnızca biçimlendirilmiş bir snippet incelemeniz veya paylaşmanız gerektiğinde, ToolDeck'in JSON Formatter daha hızlı yoldur: JSON'ınızı yapıştırın ve herhangi bir ortam kurulumu olmadan girintili, vurgulu bir sonuç alın.

İlgili Araçlar

Şu dillerde de mevcut: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 VolkovTeknik İnceleyici

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.