İçeriğe geç

Menü

Berk Akademi
Birebir ders başvurusu Ücretsiz ön görüşme Ana Sayfa

Python JSON Verisinde Anahtar Yoksa Nasıl Kontrol Edilir?

python-json-verisinde-anahtar-yoksa-nasil-kontrol-edilir
Bu yazıda neler var?
  1. JSON anahtarı eksik olduğunda neden KeyError oluşur?
  2. in, get() ve köşeli parantez arasında nasıl seçim yapılır?
  3. İç içe JSON verisine güvenli biçimde nasıl erişilir?
  4. Anahtar kontrolünün yanında hangi doğrulamalar gerekir?

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 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?

İç 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:

  1. Mevcut düğümün sözlük, liste veya başka bir tür olup olmadığını kontrol et.
  2. İhtiyacın varsa anahtarın varlığını in ya da sentinel ile belirle.
  3. Anahtarın değeri None ise bunun kabul edilip edilmeyeceğine karar ver.
  4. 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: city gibi metin beklenen bir alanı kullanmadan önce isinstance(deger, str) ile doğrula.
  • Boş ve özel değerler: None veya 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.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin, yazılım geliştirici ve eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; İzmir Ekonomi Üniversitesi'ni bölüm birincisi ve yüksek şeref öğrencisi olarak tamamladı. Bugün yalnızca eğitim vermekle kalmıyor, sektörde aktif olarak yazılım projeleri geliştiriyor ve gerçek dünya deneyimini birebir derslerine taşıyor. Ezberden uzak, mühendislik zihniyetini merkeze alan sürdürülebilir öğrenme sistemleri tasarlayarak sorgulayan, üreten ve problem çözebilen yeni nesil yazılımcılar yetiştiriyor.

Sektörel Deneyim & Projeler

  • Ticarify Entegrasyon Yazılım logosu CEO Ticarify Entegrasyon YazılımPazaryerleri ve e-ticaret sitelerine otomatik e-fatura kesimi, sipariş ve kargo takibi hizmetleri sunan e-Dönüşüm platformunun API mimarisini ve yazılım ekibini yönetmektedir.
  • Benim Düğünüm logosu CEO Benim DüğünümDijital etkinlik ve anı paylaşım platformu.
  • Siberdizayn logosu Yazılım Ekibi Lideri SiberdizaynYüksek anlık oyuncu trafiğine sahip oyun kontrol panelleri ve sunucu altyapıları geliştiren yazılım ekibine liderlik etmektedir.
  • MEDYOGRAFYA 360° Dijital Çözümler logosu Dijital Strateji Lideri MEDYOGRAFYA 360° Dijital ÇözümlerŞirketlerin dijital çözümlerde uzun vadede nasıl ilerlemesi gerektiği ve dijital dönüşüm süreçlerinin yönetilmesine destek olmaktadır.
  • İzmir Ekonomi Üniversitesi logosu Danışma Kurulu Üyesi İzmir Ekonomi ÜniversitesiMezun olduğu üniversitesinde, Bilgisayar Programcılığı bölümünün akademik müfredatını güncel sektör ihtiyaçlarına göre şekillendirmek adına Danışma Kurulu'nda görev almaktadır.
WhatsApp Hemen Ara