Python "TypeError: the JSON object must be str, bytes or bytearray, not dict" hatası, json.loads() işlevine JSON metni yerine zaten Python nesnesi olan bir dict verildiğinde oluşur. json.loads(), JSON metni taşıyan str, bytes veya bytearray değerini Python nesnesine ayrıştırır; değer zaten dict ya da list ise doğrudan kullanılmalıdır.
Python nesnesini JSON metnine çevirmek gerektiğinde json.dumps() kullanılır. Bu nedenle çözüm için önce verinin türünü, ardından verinin bellekte mi dosyada mı olduğunu ve hangi yöne dönüştürüleceğini belirlemek gerekir.
Hata mesajı ne anlatıyor: json.loads() JSON metni, dict ise Python nesnesidir
json.loads(), bellekte bulunan JSON metnini ayrıştırarak Python nesnesine dönüştürür. Aşağıdaki örnekte JSON metni önce dict türüne çevrilir, ardından name anahtarındaki değer yazdırılır:
import json
json_metni = '{"name": "Ada"}'
veri = json.loads(json_metni)
print(veri["name"])
Beklenen çıktı: Ada
Değer zaten Python dict türündeyse tekrar json.loads() kullanmana gerek yoktur. Anahtara doğrudan erişebilirsin:
veri = {"name": "Ada"}
print(veri["name"])
Beklenen çıktı: Ada
İlk örnekte json_metni bir str olduğu için json.loads() doğru seçimdir. İkinci örnekte veri zaten bir dict olduğu için doğrudan veri["name"] kullanılır. Hatalı kullanım genellikle json.loads(veri) biçimindedir; çünkü bu çağrıda metin bekleyen işleve Python nesnesi gönderilir.
JSON metni olarak yazılmış {"name": "Ada"} bir JSON object'tir ve ayrıştırıldığında Python dict türüne dönüşür. ["Python", "Java"] ise JSON array'dir ve ayrıştırıldığında Python list türü elde edilir. Metin geçerli JSON biçiminde değilse ayrıştırma sırasında JSONDecodeError görülebilir; bu, dict türünün metin bekleyen işleve verilmesiyle oluşan TypeError'dan farklıdır.
Elindeki veri türüne göre doğru JSON fonksiyonunu seç

Doğru JSON fonksiyonunu seçmek için şu üç soruyu sırayla yanıtla:
- Elindeki değer hazır bir Python nesnesi mi, yoksa JSON metni mi?
- Verinin kaynağı bellekteki metin veya byte verisi mi, yoksa bir dosya mı?
- Hedefin Python nesnesi, JSON metni veya dosya içeriği mi?
| Fonksiyon | Girdi türü | Veri kaynağı | Sonuç |
|---|---|---|---|
json.loads() |
str, bytes veya bytearray içindeki JSON metni |
Bellekteki metin veya byte verisi | Python nesnesi, örneğin dict ya da list |
json.load() |
Okunabilir dosya nesnesi | JSON içeren dosya | Python nesnesi, örneğin dict ya da list |
json.dumps() |
dict veya list gibi Python nesnesi |
Bellekteki Python verisi | JSON metni, yani str |
json.dump() |
Python nesnesi ve yazılabilir dosya nesnesi | Bellekteki veri ve hedef dosya | Dosyaya yazılan JSON çıktısı |
str örneği '{"name": "Ada"}' bir metindir ve json.loads() sonrasında beklenen sonuç dict türüdür. bytes örneği b'{"name": "Ada"}', bytearray örneği ise bytearray(b'{"name": "Ada"}') biçimindedir; ikisi de geçerli JSON metni taşıyorsa sonuç yine dict olur. dict örneği {"name": "Ada"} ve list örneği ["Python", "Java"] ise değerler zaten Python nesnesidir. Bu nesnelerde doğrudan anahtar veya sıra numarasıyla çalışılır, metin üretmek gerekiyorsa json.dumps() kullanılır.
Bu temel tür ayrımını kısa sorularla pekiştirmek için Python veri türleri bilgi testi üzerinden hangi değerin metin, byte verisi veya Python nesnesi olduğunu tekrar edebilirsin.
Hatalı kodu iki doğru çözüme dönüştür

Aşağıdaki örnekte payload, JSON metni değil, Python tarafından oluşturulmuş bir dict nesnesidir:
import json
payload = {'name': 'Ada'}
json.loads(payload)
json.loads() ayrıştırmak için str, bytes veya bytearray türünde JSON içeriği bekler. payload ise zaten Python nesnesi olan bir dict olduğu için TypeError: the JSON object must be str, bytes or bytearray, not dict hatası oluşur.
Birinci çözüm: Dict nesnesini doğrudan kullan
Veri zaten dict hâline geldiyse yeniden ayrıştırmaya gerek yoktur. Alanlara doğrudan erişebilirsin:
import json
payload = {'name': 'Ada'}
data = payload
print(data['name'])
Beklenen çıktı:
Ada
Bu yaklaşımda payload, doğrudan uygulamanın kullanacağı data nesnesi olur. Verinin yönü JSON metninden Python nesnesine doğru değil, zaten Python nesnesi olarak uygulamaya ulaşmıştır.
İkinci çözüm: Gerekirse JSON metni üzerinden ilerle
Bir işlem gerçekten JSON metni gerektiriyorsa önce json.dumps() ile dict nesnesini metne dönüştür, ardından bu metni json.loads() ile ayrıştır:
import json
payload = {'name': 'Ada'}
json_text = json.dumps(payload)
data = json.loads(json_text)
print(type(json_text).__name__)
print(data['name'])
Beklenen çıktı:
str
Ada
json_text değişkeninin türü str olur. json.loads(json_text) çağrısından sonra veri yeniden Python dict nesnesine dönüşür.
Bir API benzeri akışta dış sistemden gelen içerik önce JSON metnidir. json.loads() bu metni, içeriğe göre bir dict veya list nesnesine dönüştürür. Uygulama bu Python nesnesiyle çalışır. Dışarıya yeniden JSON gönderilmesi gerektiğinde json.dumps() nesneyi tekrar JSON metni olan bir str değerine çevirir. Veri zaten dict veya list hâline geldiyse loads() aşaması tamamlanmıştır; aynı veriyi tekrar loads() içine vermek TypeError üretir.
json.load() ve json.dump() dosyayla, loads() ve dumps() metinle çalışır
Fonksiyon seçimini verinin bulunduğu yere ve dönüşüm yönüne göre yapabilirsin:
json.loads(), bellekteki JSON metnini Python nesnesine dönüştürür.json.dumps(), Python nesnesini bellekte kullanılabilecek JSON metnine dönüştürür.json.load(), açık bir dosya nesnesindeki JSON içeriğini Python nesnesine dönüştürür.json.dump(), Python nesnesini açık bir dosya nesnesine JSON olarak yazar.
Aşağıdaki örnek kaynak dosyayı oluşturur, sonra json.load() ile okur ve başka bir dosyaya json.dump() ile yazar:
import json
with open('data.json', 'w', encoding='utf-8') as file:
json.dump({'name': 'Ada'}, file, ensure_ascii=False, indent=2)
with open('data.json', 'r', encoding='utf-8') as file:
data = json.load(file)
with open('copy.json', 'w', encoding='utf-8') as file:
json.dump(data, file, ensure_ascii=False, indent=2)
print(type(data).__name__)
print(data['name'])
Beklenen çıktı:
dict
Ada
Bu çalışmadan sonra copy.json dosyasında biçimlendirilmiş JSON içeriği oluşur. load() ve dump() işlevlerine dosya yolu tek başına verilmez. Önce open() ile uygun bir dosya nesnesi oluşturulur ve bu nesne işleve aktarılır.
JSONDecodeError, loads() için verilen metin veya load() ile okunan dosya içeriği geçerli JSON söz dizimine uymadığında görülebilen ayrıştırma hatasıdır. Bir dict nesnesini loads() içine vermek ise söz dizimi sorunu değil, beklenen veri türünün yanlış olması nedeniyle oluşan TypeError durumudur.
Adım adım teşhis: veri nerede Python nesnesine dönüştü?
Bu hatayı çözmenin en kısa yolu, json.loads() çağrısından önce elindeki değerin türünü ve verinin hangi yöne ilerlediğini kontrol etmektir. str, bytes veya bytearray JSON metni taşıyabilir. dict ve list ise Python içinde zaten oluşturulmuş nesnelerdir.
Elimdeki veri nedir ve nereye gidiyor?
Önce type(value).__name__ ile türü yazdır. Değerin türü dict veya list ise veri daha önce ayrıştırılmıştır. Bu durumda aynı değeri tekrar json.loads() içine vermek yerine doğrudan kullanmalısın.
value = {"ad": "Ada", "aktif": True}
print(type(value).__name__)
# data = json.loads(value) # Hatalı çağrı kaldırıldı
data = value
print(type(data).__name__)
Beklenen tür çıktısı:
dict
dict
Karar çerçevesi verinin yönüne göre kurulabilir: JSON metninden Python nesnesine geçiyorsan metin için loads, açılmış dosya için load kullanılır. Python içindeki dict veya list değerini JSON metnine dönüştürüyorsan metin için dumps, dosyaya yazıyorsan dump seçilir. Değer zaten Python nesnesiyse hedef doğrudan kullanım olabilir.
str(dict) ise JSON serileştirmesi değildir; sözlüğün Python gösterimini üretir. Bu gösterimde tek tırnaklar, True, False ve None gibi Python'a özgü yazımlar bulunabilir. JSON sözdiziminde bunların karşılığı çift tırnak, true, false ve null biçimindedir. JSON metni üretmek için json.dumps() kullanılır.
import json
value = {"aktif": True, "sonuc": None}
print(str(value))
print(json.dumps(value))
Beklenen çıktı:
{'aktif': True, 'sonuc': None}
{"aktif": true, "sonuc": null}
Beş adımlı kontrol listesi
loadsveyaloadçağrısından öncetype(value).__name__ile türü kontrol et.- JSON metninin ilk kez hangi satırda
dictveyalistdeğerine dönüştüğünü bul. - Aynı değeri, dönüştürüldükten sonra ikinci kez
loadsiçine verme. - Hedef doğrudan Python verisi ise değeri kullan, metin gerekiyorsa
dumpsseç. - Kaynak veya hedef dosyaysa, açılmış dosya nesnesiyle
loadya dadumpkullan.
Temel Python ve veri türleri pratiğini sürdürmek için ücretsiz Sıfırdan Temel Python video eğitimini inceleyerek benzer örnekleri deneyebilirsin.
Sık Sorulan Sorular
json.loads() içine dict verilince neden TypeError oluşur?
json.loads(), JSON metnini Python nesnesine dönüştürür. dict ise zaten Python nesnesi olduğu için beklenen giriş türü değildir ve TypeError oluşur.
json.load() ile json.loads() arasındaki fark nedir?
json.loads() metin, bytes veya bytearray üzerinden ayrıştırma yapar. json.load() ise JSON içeren açılmış bir dosya nesnesinden okur.
json.dumps() ile json.dump() hangi durumda seçilir?
json.dumps() Python nesnesinden JSON metni üretir. json.dump() ise Python nesnesini doğrudan açılmış bir dosyaya yazar.
str(dict) neden JSON metnine çevirmek için uygun değildir?
str(dict), Python sözlüğünün gösterimini üretir. Tek tırnaklar ve True, False, None gibi ifadeler JSON sözdizimiyle uyuşmayabilir. Bu nedenle json.dumps() kullanılmalıdır.
TypeError ile JSONDecodeError arasındaki fark nedir?
TypeError, fonksiyona uygun olmayan tür verildiğini gösterir. JSONDecodeError ise uygun türdeki metin ayrıştırılırken JSON sözdiziminin geçersiz olduğunu belirtir.
Verinin türünü ve yönünü belirlediğinde, JSON fonksiyonları arasındaki seçimi doğru yapabilir ve aynı veriyi gereksiz yere tekrar ayrıştırmaktan kaçınabilirsin.