Python json.dumps ve json.loads farkı tek cümleyle şöyle: json.dumps bir Python nesnesini (sözlük, liste gibi) JSON metnine çevirir, json.loads ise JSON metnini tekrar Python nesnesine çevirir. İki fonksiyon birbirinin tersini yapar. Adlardaki sondaki s harfi string yani metin anlamına gelir ve hangi fonksiyonun neyle çalıştığını hatırlamanın en kolay yoludur.
dumps ve loads sonundaki "s" harfi ne anlama gelir?
Sondaki s, fonksiyonun bir str (metin) ile çalıştığını gösterir. dumps çıktı olarak metin üretir, loads girdi olarak metin alır. Python dokümantasyonundaki ayrım da buna dayanır: dumps ve loads metin üzerinde çalışır, dump ve load ise dosya benzeri nesnelerle kullanılır.
s harfi olmayan ikili de aynı işi dosya üzerinden yapar. json.dump Python nesnesini JSON olarak bir dosyaya yazar, json.load ise bir dosyayı okuyup Python nesnesine çevirir. Bu ikiliyle ilgili akılda tutman gereken tek şey, metin yerine dosya nesnesi (örneğin open() ile açtığın dosya) kullanmalarıdır.
| Fonksiyon | Dönüşüm yönü | Girdi türü | Çıktı türü | Tipik kullanım |
|---|---|---|---|---|
| json.dumps | Python nesnesi → JSON metni | dict, list vb. | str | Veriyi ekrana yazdırmak ya da bir yere metin olarak göndermek |
| json.loads | JSON metni → Python nesnesi | str | dict, list vb. | Metin olarak gelen veriyi Python'da kullanmak |
| json.dump | Python nesnesi → dosya | Nesne ve açık dosya | Yok, dosyaya yazar | Veriyi .json dosyasına kaydetmek |
| json.load | Dosya → Python nesnesi | Açık dosya | dict, list vb. | Kayıtlı .json dosyasını okumak |
Bir sözlüğü metne çevirip geri alma: adım adım örnek

Farkı en net, türleri type() ile kontrol ederek görürsün. Önce bir sözlük tanımlayalım.
Adım 1: Sözlük tanımla
import json
kisi = {"ad": "Elif", "yas": 15}
print(type(kisi))
Beklenen çıktı:
<class 'dict'>
Adım 2: dumps ile metne çevir
metin = json.dumps(kisi)
print(metin)
print(type(metin))
Beklenen çıktı:
{"ad": "Elif", "yas": 15}
<class 'str'>
Ekranda sözlüğe benziyor ama metin artık düz bir str. Bu yüzden metin['ad'] yazarsan Python TypeError verir. Metnin içinde anahtar yoktur, yalnızca karakterler vardır.
Adım 3: loads ile geri al
geri = json.loads(metin)
print(type(geri))
print(geri["ad"])
Beklenen çıktı:
<class 'dict'>
Elif
Artık anahtarla erişim çalışıyor, çünkü loads metni yeniden gerçek bir sözlüğe çevirdi.
Liste ile kısa bir ek örnek
diller = ["Python", "Java"]
print(json.dumps(diller))
Beklenen çıktı:
["Python", "Java"]
Liste, köşeli parantezli bir JSON metnine dönüşür ve bu çıktı da yine bir str'dir. Böylece üç türü ayırabilirsin: str metindir, dict anahtar-değer çiftleridir, list sıralı değerlerdir. Yeni öğrendiğin türleri ve fonksiyonları denemek istersen ücretsiz Python bilgi testiyle seviyeni ölçebilirsin.
API'den gelen metin loads ile nasıl Python nesnesine dönüşür?

Bir API yanıtı ağ üzerinden Python nesnesi olarak değil, düz metin olarak gelir. Bu metin JSON biçimindedir ama Python açısından yalnızca bir str değeridir. Anahtarla erişebilmek için önce json.loads ile dict ya da list türüne çevirmen gerekir. Aşağıdaki örnekte gerçek bir istek atmıyoruz. Yanıt gövdesini temsil eden sabit bir metin kullanıyoruz.
import json
govde = '{"kullanici": {"ad": "Elif", "okul": "Lise"}, "puan": 85}'
veri = json.loads(govde)
print(type(veri))
print(veri["kullanici"]["ad"])
print(veri["puan"] + 5)
Beklenen çıktı:
<class 'dict'>
Elif
90
Çözülmüş veride iç içe alana veri["kullanici"]["ad"] ile ulaşılır ve puan gerçek bir sayı olduğu için toplama yapılabilir. govde değişkenine aynı şekilde ["puan"] yazsaydın, bir metnin içinde anahtar aradığın için hata alırdın.
İstekleri requests kütüphanesiyle atarsan yanıtın gövdesi yine metindir. Yanıt nesnesinin .json() yöntemi bu metni Python nesnesine çevirir. Mantık aynıdır: metin gelir, nesne çıkar.
Python sözlüğü ile JSON metni neden aynı görünmez?
İkisi ilk bakışta benzer, ama JSON ayrı bir metin biçimidir. Kuralları Python'dan farklıdır. Anahtarlar ve metinler çift tırnakla yazılır, mantıksal değerler küçük harfle yazılır ve None yerine null kullanılır. Aşağıdaki örnek farkları yan yana gösterir.
import json
ogrenci = {"ad": "Şule", "aktif": True, "mezuniyet": None, "dersler": ("Python", "Java")}
print(ogrenci)
metin = json.dumps(ogrenci)
print(metin)
print(json.dumps(ogrenci, ensure_ascii=False))
geri = json.loads(metin)
print(geri["dersler"])
Beklenen çıktı:
{'ad': 'Şule', 'aktif': True, 'mezuniyet': None, 'dersler': ('Python', 'Java')}
{"ad": "u015eule", "aktif": true, "mezuniyet": null, "dersler": ["Python", "Java"]}
{"ad": "Şule", "aktif": true, "mezuniyet": null, "dersler": ["Python", "Java"]}
['Python', 'Java']
İlk satır print(ogrenci) çıktısıdır: tek tırnaklı, True ve None içeren bir Python görünümü. İkinci satır geçerli JSON metnidir: çift tırnak, true ve null kullanır.
Tuple list olarak geri döner
JSON'da tuple karşılığı yoktur. dumps tuple'ı köşeli parantezli bir diziye çevirir. loads bu diziyi geri okuyunca sonuç list olur. Dönüşüm gidiş dönüşte birebir aynı türü geri vermez.
Türkçe karakterler ve ensure_ascii
ensure_ascii varsayılan olarak True olduğu için ş, ğ, ı gibi harfler u015e biçiminde kaçış dizisine dönüşür. Veri yine geçerlidir ve loads bunu doğru okur, ama gözle okunmaz. ensure_ascii=False yazarsan harfler olduğu gibi kalır.
Hatalı biçimi loads'a vermek de bir yanlış anlamadır. print(ogrenci) çıktısını kopyalayıp loads'a verirsen tek tırnaklar JSON kuralına uymadığı için Python hata verir. Metni JSON olarak üretmek için dumps kullanman gerekir.
Hangi fonksiyonu seçmeli? Üç soruluk kontrol listesi
Kod yazarken şu üç soruyu sırayla sor. Cevapların hangi fonksiyonu seçeceğini kendiliğinden gösterir.
- Elimde ne var? Python nesnesi (sözlük, liste) varsa ve bunu JSON'a çevireceksen
dumps, elinde JSON metni varsa ve bunu Python'da kullanacaksanloadskullanılır. - Sonuç nerede duracak? Metin bellekte, bir değişkende kalacaksa
dumpsveloadsyeterlidir. Veri bir dosyaya yazılacak ya da dosyadan okunacaksadumpveload(sonunda s yok) kullanılır. - Türkçe karakterler okunur kalmalı mı? Evetse
ensure_ascii=Falseekle. Varsayılan davranışta ş, ğ, ı gibi harfleru015fbiçiminde kaçış koduna dönüşür.
import json
ogrenci = {"ad": "Şule", "sinif": 9}
print(json.dumps(ogrenci))
print(json.dumps(ogrenci, ensure_ascii=False))
Beklenen çıktı:
{"ad": "u015eule", "sinif": 9}
{"ad": "Şule", "sinif": 9}
Hatırlama ipucu: s = string. Fonksiyona metin giriyorsa ya da fonksiyondan metin çıkıyorsa s'li olanı seç. Dosya söz konusuysa s'siz olanı seç.
Bu karar adımlarını biraz pratikle ezbersiz kullanırsın. Python'a yeni başlıyorsan ücretsiz Sıfırdan Temel Python video eğitimi sözlük, liste ve fonksiyon temellerini kendi hızında çalışmak için iyi bir başlangıç olabilir.
Kısacası dumps ve loads aynı köprünün iki yönüdür. Hangi tarafta durduğunu bildiğinde doğru fonksiyonu seçmek zorlaşmaz.