Python JSON verisinde anahtar yoksa kontrol etmek için önce verinin sözlük mü, liste mi olduğunu anlamalısın. Sözlüklerde anahtar varlığını in ile sınayabilir, isteğe bağlı alanları get() ile okuyabilir veya zorunlu alanlarda köşeli parantez kullanabilirsin. Seçim, eksik anahtar karşısında hata mı yoksa varsayılan bir değer mi istediğine bağlıdır.
Eksik bir anahtara doğrudan erişmek Python'da KeyError oluşturur. Bu davranış, veride bulunmayan bir alanın sessizce yok sayılmasını engelleyerek eksikliği açıkça gösterir.
JSON anahtarı eksik olduğunda neden KeyError oluşur?

JSON nesnesi Python tarafından ayrıştırıldığında genellikle sözlüğe, yani dict yapısına dönüşür. JSON dizisi ise listeye, yani list yapısına dönüşür. Bu iki yapıya erişim biçimi aynı değildir: sözlükte anahtar adı, listede ise çoğunlukla sıra numarası kullanılır. Örneğin bir liste elemanına items[0] ile erişilirken sözlükte belirli bir anahtar aranır.
Aşağıdaki sözlükte yalnızca name anahtarı vardır:
data = {"name": "Ada"}
print(data["city"])
city anahtarı sözlükte bulunmadığı için beklenen sonuç KeyError: 'city' olur. Köşeli parantez kullanımı, belirtilen anahtarın mevcut olduğunu varsayar. Anahtar yoksa Python, değer üretemediğini KeyError ile bildirir. Bu nedenle köşeli parantez, alanın zorunlu olduğu ve eksikliğin fark edilmesi gereken durumlarda anlamlıdır.
in, get() ve köşeli parantez arasında nasıl seçim yapılır?
Yöntem seçerken önce amacını belirle: yalnızca anahtarın varlığını mı sınayacaksın, isteğe bağlı bir değeri mi okuyacaksın, yoksa eksik alanın doğrudan hata vermesini mi istiyorsun?
| Amaç | Yöntem | Eksik anahtardaki davranış | Ne zaman seçilir? |
|---|---|---|---|
| Yalnızca varlığı sınamak | in |
True veya False döner, hata oluşturmaz. |
Zorunlu alanı kullanmadan önce kontrol yapmak için |
| İsteğe bağlı alanı okumak | get() |
None veya verdiğin varsayılan değeri döndürür. |
Eksik alanda programın çalışmaya devam etmesi için |
| Eksikliği hata olarak göstermek | data["anahtar"] |
KeyError oluşturur. |
Alan kesinlikle gerekli olduğunda |
Yalnızca city anahtarının bulunup bulunmadığını kontrol etmek için in kullanabilirsin:
data = {"name": "Ada"}
if "city" in data:
print(data["city"])
else:
print("city anahtarı yok")
Beklenen çıktı:
city anahtarı yok
Alan isteğe bağlıysa data.get("city") kullanabilir veya data.get("city", "Bilinmiyor") gibi bir varsayılan değer belirleyebilirsin. Alan zorunluysa ve eksik olduğunda programın bunu açıkça bildirmesi gerekiyorsa doğrudan data["city"] yaklaşımı tercih edilebilir.
Köşeli parantez eksik anahtarda KeyError üretir; get() ise anahtar yoksa None ya da verdiğin varsayılan değeri döndürür.
İç içe JSON verisine güvenli biçimde nasıl erişilir?

Python nesnesine dönüştürülen iç içe JSON verisinde her ara düğümün sözlük olacağını varsaymamalısın. Örneğin veri.get("profile", {}).get("address", {}).get("city") ifadesi ilk bakışta güvenli görünür. Ancak profile anahtarı varsa ve değeri None ya da listeyse sonraki get() çağrısı çalışmaz. Varsayılan boş sözlük yalnızca anahtar bulunmadığında kullanılır.
Daha güvenli yaklaşım, ara değeri alıp türünü kontrol ederek ilerlemektir:
veri = {
"profile": {
"address": {
"city": "İzmir"
}
}
}
profil = veri.get("profile")
if isinstance(profil, dict):
adres = profil.get("address")
else:
adres = None
if isinstance(adres, dict):
sehir = adres.get("city")
else:
sehir = None
print(sehir)
Beklenen çıktı:
İzmir
Bu örnekte address değerinin None olması programı durdurmaz. Tür kontrolü başarısız olur ve sehir değişkenine None atanır.
Bir başka önemli ayrım, anahtarın hiç bulunmaması ile bulunup değerinin None olmasıdır. Normal bir get() çağrısı iki durumda da None döndürebilir. Bu durumları ayırmak için in kullanabilir veya benzersiz bir sentinel nesnesi oluşturabilirsin:
veri = {"city": None}
YOK = object()
sehir = veri.get("city", YOK)
if sehir is YOK:
print("Anahtar yok.")
elif sehir is None:
print("Anahtar var, değer None.")
else:
print(sehir)
Beklenen çıktı:
Anahtar var, değer None.
İç içe veriye erişirken şu karar sırasını uygulayabilirsin:
- Mevcut düğümün sözlük, liste veya başka bir tür olup olmadığını kontrol et.
- İhtiyacın varsa anahtarın varlığını
inya da sentinel ile belirle. - Anahtarın değeri
Noneise bunun kabul edilip edilmeyeceğine karar ver. - Tür ve değer kontrolleri tamamlandıktan sonra veriyi kullan.
Anahtar kontrolünün yanında hangi doğrulamalar gerekir?
Bir anahtarın bulunması, değerinin kullanılabilir olduğu anlamına gelmez. city anahtarı mevcut olduğu hâlde değeri sayı, liste, boş metin veya None olabilir. Bu nedenle eksik ya da güvenilmeyen yapılandırılmış veriyi işlerken yapıyı aşamalı olarak doğrulamalısın.
- Kök yapı: En dıştaki verinin beklediğin gibi sözlük mü, yoksa liste mi olduğunu kontrol et.
- İç içe düğümler: Üzerinde
get()kullanacağın her değerin sözlük olduğundan emin ol. - Liste sınırları: Bir elemana indeksle erişmeden önce listenin yeterli uzunlukta olup olmadığını denetle.
- Liste elemanları: Listenin içindeki değerlerin beklenen türü taşıdığını ayrıca kontrol et.
- Alan türleri:
citygibi metin beklenen bir alanı kullanmadan önceisinstance(deger, str)ile doğrula. - Boş ve özel değerler:
Noneveya boş metnin uygulaman açısından geçerli olup olmadığını belirle.
Sözlükler, get(), in ve koşullu ifadeler konusunda temel tekrar yapmak istersen ücretsiz Sıfırdan Temel Python video eğitiminden yararlanabilirsin.
Kısacası amacın yalnızca hatayı önlemekse get(), eksik anahtarı ayırt etmekse in veya sentinel kullan. İç içe yapılarda ise her düğümün türünü doğrulayarak adım adım ilerle.