JSON ve Python Aynı Şekillerden Konuşur
JSON, web üzerindeki API'ler, konfig dosyaları ve veri alışverişi için varsayılan formattır. Python programcıları için şanslı olan şu: bir JSON nesnesi doğrudan Python dict'ine, bir JSON dizisi bir liste'ye, bir JSON string'i bir str'ye oturur. Bu sıkı hizalama, Python'da JSON okuma ve yazmanın iki satırlık bir iş olmasının sebebi.
Standart kütüphanedeki json modülü her iki yönü de halleder.
Bir JSON String'ini Ayrıştırmak
json.loads(text) — "load string" — bir JSON formatlı string alır ve temsil ettiği Python nesnesini döndürür:
Sonuç düz bir dict'tir. Anahtarlarına herhangi bir dict gibi erişirsin — özel JSON sarmalayıcısı yok, sonuç üzerinde .parse() metodu yok.
String geçerli JSON değilse, json.loads json.JSONDecodeError fırlatır. Hata mesajı, sorunun satır ve sütun numarasını içerir; eksik virgül ya da kaçış karakteri konmamış tırnak bulmaya genelde bu yeter.
JSON'u String Olarak Yazmak
json.dumps(data) — "dump string" — tam tersini yapar: bir Python nesnesi alır ve bir JSON string'i döndürür:
Python'un True, False ve None değerleri otomatik olarak JSON'un true, false ve null'ına çevrilir. Sayılar ve string'ler olduğu gibi geçer. Listeler dizilere, dict'ler nesnelere dönüşür.
Süslü Yazdırma
json.dumps'ın varsayılan çıktısı sıkıştırılmıştır — ağ üzerinde taşımak için uygun, insan gözü için zor. Daha okunaklı bir şey için indent=2 geç:
Bilmeye değer birkaç dumps seçeneği daha:
sort_keys=True— nesne anahtarlarını alfabetik sırala. Deterministik çıktı için kullanışlı (konfig dosyaları, test fixture'ları, diff'ler).ensure_ascii=False— ASCII olmayan karakterleri (é, ü, 中)\ukaçışları yerine oldukları gibi yaz. UTF-8 dosyalar için genelde doğru tercih.separators=(",", ":")— mümkün olan en sıkı çıktı.ensure_ascii=Falseile birleşince, üretebileceğin en kompakt UTF-8 JSON'u verir.
Dosyadan JSON Okumak
json.load(file) — s yok — doğrudan bir dosya nesnesinden okur. Yaygın kalıp bunu with open ile eşleştirir:
import json
with open("config.json") as f:
config = json.load(f)
print(config["version"])
Önce tüm dosyayı bir string'e almana gerek yok; json.load dosya nesnesi üzerinden akış olarak geçer.
Dosyaya JSON Yazmak
json.dump(data, file), dosya-yazma karşılığıdır:
import json
data = {"created": "2026-01-01", "items": [1, 2, 3]}
with open("state.json", "w") as f:
json.dump(data, f, indent=2)
indent seçeneği burada da çalışır. Oluşan dosyayı aç, güzel biçimlendirilmiş bir JSON dokümanı göreceksin.
Bir JSON API Yanıtını Okumak
Çoğu HTTP kütüphanesi sana byte ya da metin uzatır; onları kullanılabilir veriye çevirmek için json.loads çağırırsın:
import json
import urllib.request
with urllib.request.urlopen("https://api.example.com/users/1") as response:
text = response.read().decode("utf-8")
user = json.loads(text)
print(user["name"])
requests kütüphanesi (ayrı olarak anlatılıyor) bir adımı atlar — yanıt üzerinde json.loads'u senin için çağıran bir .json() metodu vardır.
JSON Ne Temsil Edebilir, Ne Edemez
JSON'un tip sistemi Python'unkinden dardır. Her iki yöndeki eşleme:
| Python | JSON |
|---|---|
dict | object |
list, tuple | array |
str | string |
int, float | number |
True | true |
False | false |
None | null |
Tuple'lar liste olarak gidip gelir — tuple'lık kaybolur. Set'ler, özel sınıflar ve datetime nesneleri varsayılan olarak serileştirilemez; TypeError: Object of type X is not JSON serializable alırsın.
datetime ve Özel Nesneleri Yönetmek
İki yaygın yaklaşım.
Önce JSON-uyumlu bir yapıya çevir. Dönüşümü kendi kodunda yap, sonra düz bir dict'i serileştir:
Bir default= fonksiyonu geç. json.dumps bunu, nasıl serileştireceğini bilmediği her değer için çağırır:
Veriyi okurken bu ISO string'leri datetime'a kendin çevirmen gerekir — JSON onların aslen ne olduğunu hatırlamaz.
Bir Dict'i JSON Üzerinden Gidip Getirmek
Dict'lerin sağ salim döndüğünü hızlı bir test:
Değerler eşittir ama farklı nesnelerdir. Genelde istediğin de budur — json.dumps + json.loads, JSON-uyumlu herhangi bir yapının derin bir kopyasını yapmanın ucuz bir yoludur.
Gerçekçi Bir Örnek
Bir JSON konfigürasyonu yükleyen, bir alanı güncelleyen ve geri kaydeden küçük bir script:
import json
from pathlib import Path
config_path = Path("settings.json")
# Yükle (dosya yoksa bir varsayılanla).
if config_path.exists():
config = json.loads(config_path.read_text())
else:
config = {"theme": "dark", "last_opened": None}
# Güncelle.
config["last_opened"] = "2026-01-15"
# Düzgün biçimlendirilmiş olarak kaydet.
config_path.write_text(json.dumps(config, indent=2, ensure_ascii=False))
Bu, bir düzine satırda eksiksiz bir "oku, değiştir, yaz" JSON döngüsü.
Birkaç Alışkanlık
- Dosyalar için her zaman
with open(...)kullan. JSON da metindir; tüm dosya-işleme kuralları geçerli. - İnsan gözünün okuyacağı dosyalarda
indent=2'yi tercih et — konfig, fixture, dışa aktarılmış veri. Kompaktlığın önemli olduğu ağ trafiğinde atla. - UTF-8 çıktı için
ensure_ascii=False'u aç ki vurgulu ya da Latin dışı karakterlere sahip isimler okunaklı kalsın. - Sen üretmediğin veriyi ayrıştırırken
try/except json.JSONDecodeErrorile doğrula.
Sırada
JSON anahtar-değer verisini halleder. Aynı bölümdeki bir sonraki araç CSV — karşılaşacağın çoğu tablosal format dışa aktarımı için Python'un yerleşik desteği.
Sıkça Sorulan Sorular
Python'da JSON'u nasıl ayrıştırırım?
JSON string'i için json.loads(text), dosya nesnesi için json.load(file) kullan. İkisi de bir Python dict (ya da JSON'a göre list) döndürür. Örnek: data = json.loads('{"name": "Rosa"}') — data['name'] 'Rosa' olur.
Bir Python sözlüğünü JSON'a nasıl çeviririm?
json.dumps(my_dict) bir JSON string döndürür. json.dump(my_dict, file) doğrudan dosya nesnesine yazar. Süslü çıktı için indent=2 ver: json.dumps(data, indent=2).
json.loads ile json.load arasındaki fark nedir?
loads (sonunda s var) bir string alır. load (s yok) bir dosya nesnesi alır. dumps ile dump için de aynı. s, string içindir; hangisinin hangisi olduğunu hatırlamanın en kolay yolu budur.
JSON'da tarihleri ve özel nesneleri nasıl yönetirim?
JSON'un tarih tipi yok, yani tarihleri ISO-8601 string olarak geçir ve okurken manuel ayrıştır. Özel sınıflar için ya json.dumps'a JSON-uyumlu bir temsil döndüren bir default= fonksiyonu ver ya da serileştirmeden önce elle bir dict'e çevir.