İçeriğe geç

Menü

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

Python JSON Listesi Nasıl Filtrelenir? İç İçe Veriyi Seçme

python-json-listesi-nasil-filtrelenir-ic-ice-veriyi-secme
Bu yazıda neler var?
  1. Python JSON listesi nasıl filtrelenir?
  2. JSON veri yapısını filtrelemeden önce nasıl teşhis edersin?
  3. Stokta olan ve belirli kategorideki ürünler nasıl seçilir?
  4. İç içe sözlüklere get() ile güvenli erişim
  5. for döngüsü mü, liste üreteci mi? loads ve load farkı
  6. Sık Sorulan Sorular

Python JSON listesi nasıl filtrelenir? JSON metnini json.loads(), dosya benzeri girdiyi json.load() ile ayrıştırdığında JSON dizisi Python listesine, JSON nesnesi ise Python sözlüğüne dönüşür. Sonra kayıtları for döngüsü veya liste üreteciyle dolaşıp koşulu sağlayan ürünleri yeni bir listeye alırsın. Sağlam bir filtre için iki aşamalı ilerlemek gerekir: önce dış kabı ve iç içe seviyeyi teşhis et, sonra eksik alanları hesaba katan koşulu kur.

Bu yaklaşımda amaç JSON metnini doğrudan filtrelemek değil, Python'a dönüştükten sonra oluşan ürün listesi ve sözlükleri üzerinde çalışmaktır. Böylece stok alanını doğrudan, kategori adını ise bulunduğu iç sözlük üzerinden değerlendirebilirsin.

Python JSON listesi nasıl filtrelenir?

Filtreleme adımı, ayrıştırılmış listenin her elemanını inceleyerek yalnızca koşulu karşılayanları seçmektir. Veri bir dosyadan okunuyorsa json.load() okuma ve dönüşüm aşamasında kullanılır; sonrasındaki filtre mantığı yine Python listesi ve sözlükleri üzerinde çalışır. Aşağıdaki örnekte stok değeri sıfırdan büyük ürünler seçiliyor.

import json

json_metni = '[{"ad": "Defter", "stok": 8}, {"ad": "Kalem", "stok": 0}]'
urunler = json.loads(json_metni)

stokta_olanlar = [
    urun for urun in urunler
    if urun.get("stok", 0) > 0
]

print([urun["ad"] for urun in stokta_olanlar])

Beklenen çıktı ['Defter'] olur. Buradaki get("stok", 0) kullanımı, stok anahtarı bulunmayan bir kayıtta varsayılan olarak 0 değerini alır. Böylece eksik alanları filtre koşuluna dahil ederken doğrudan anahtar erişiminden kaynaklanabilecek hataları azaltırsın.

JSON veri yapısını filtrelemeden önce nasıl teşhis edersin?

JSON veri yapısını filtrelemeden önce nasıl teşhis edersin?

Filtre koşulunu yazmadan önce örnek şemayı katmanlara ayır. Dışta bir JSON dizisi, ayrıştırma sonrasında Python listesi, listenin her öğesinde bir ürün sözlüğü ve bu sözlükte kategori alanının içinde ad anahtarı bulunur. Örneğin [{"ad": "Defter", "stok": 8, "kategori": {"ad": "Kırtasiye"}}] yapısında kategori adı, ürün sözlüğünün doğrudan bir değeri değil, içteki sözlüğün alanıdır.

JSON'u filtrelemeden önce Python'da listenin mi, sözlüğün mü ve iç içe yapının hangi seviyede olduğunu kontrol et.

  1. Dış yapıyı belirle: Ayrıştırma sonucunun liste mi, sözlük mü olduğunu kontrol et. Dış yapı listeyse önce listedeki her ürünü dolaşırsın. Dış yapı bir sözlükse ürün listesini taşıyan anahtara önce erişmen gerekir. İç alanın hangi seviyede bulunduğunu da aynı adımda belirle.
  2. Eksik alanları planla: stok, kategori veya içteki ad anahtarı her kayıtta bulunmayabilir. Kullanılacak varsayılan değeri önceden belirle ve koşulu eksik kayıtları güvenli biçimde ele alacak şekilde kur.

Temel liste ve sözlük bilgilerini pekiştirmek için ücretsiz Sıfırdan Temel Python video eğitimini kullanarak ayrıştırılmış veriler üzerinde küçük alıştırmalar yapabilirsin.

Stokta olan ve belirli kategorideki ürünler nasıl seçilir?

Stokta olan ve belirli kategorideki ürünler nasıl seçilir?

Stokta olan ve belirli bir kategoriye ait ürünleri seçmek için JSON metnini önce json.loads() ile Python listesine dönüştürür, sonra listedeki her sözlüğü for döngüsüyle kontrol edersin. Bu örnekte kayıt, yalnızca stok değeri sıfırdan büyükse ve iç içe kategori sözlüğündeki ad aksesuar ise yeni listeye ekleniyor.

İki aşamalı düşün: Önce veri yapısının seviyesini belirle. Dış yapı liste, her ürün bir sözlük, kategori ise başka bir sözlüktür. Ardından eksik alanlar için uygun varsayılanları seçip koşulu yaz.

json.loads() JSON metnini Python nesnelerine çevirir. Filtreleme sonrasında json.dumps() listeyi yeniden JSON metnine dönüştürür; ensure_ascii=False Türkçe karakterleri korur, indent=2 ise çıktıyı iki boşluklu girintilerle biçimlendirir.

import json

json_metni = """
[
  {"ad": "Klavye", "stok": 12, "kategori": {"ad": "aksesuar"}},
  {"ad": "Monitör", "stok": 0, "kategori": {"ad": "aksesuar"}},
  {"ad": "USB Bellek", "stok": 7, "kategori": {"ad": "depolama"}},
  {"ad": "Kulaklık", "stok": 3, "kategori": {"ad": "aksesuar"}},
  {"ad": "Web Kamera", "kategori": {"ad": "aksesuar"}},
  {"ad": "Mikrofon", "stok": 4}
]
"""

urunler = json.loads(json_metni)
uygun_urunler = []

for urun in urunler:
    stok = urun.get('stok', 0)
    kategori = urun.get('kategori') or {}
    kategori_adi = kategori.get('ad', '')

    if stok > 0 and kategori_adi == 'aksesuar':
        uygun_urunler.append(urun)

filtrelenmis_json = json.dumps(uygun_urunler, ensure_ascii=False, indent=2)
print(filtrelenmis_json)

Çıktıda Klavye ve Kulaklık kalır. Monitörün stoğu 0 olduğu için, USB Bellek kategorisi depolama olduğu için dışarıda kalır. Web Kamera kaydında stok anahtarı bulunmadığından get('stok', 0) değeri 0 kabul eder. Mikrofon kaydında kategori bulunmadığı için kategori adı boş metin olur ve ikinci koşul sağlanmaz.

[
  {
    "ad": "Klavye",
    "stok": 12,
    "kategori": {
      "ad": "aksesuar"
    }
  },
  {
    "ad": "Kulaklık",
    "stok": 3,
    "kategori": {
      "ad": "aksesuar"
    }
  }
]

Bu yaklaşımı kendi örneklerin üzerinde pekiştirmek için birebir Python dersleri hakkında bilgi alabilir ve veri yapısını teşhis etme adımını düzenli biçimde çalışabilirsin.

İç içe sözlüklere get() ile güvenli erişim

urun['kategori']['ad'] biçimindeki doğrudan erişim kısa görünür; ancak kategori veya ad anahtarlarından biri eksikse KeyError oluşabilir. Aynı durum stok anahtarı için de geçerlidir. Sözlük belgelerinde köşeli parantezle erişimin eksik anahtarda hata verdiği, get() yönteminin ise anahtar yoksa varsayılan değeri döndürdüğü belirtilir.

# Önce: eksik anahtar varsa hata verebilir
kategori_adi = urun['kategori']['ad']
stok = urun['stok']

# Sonra: eksik alanlara uygun varsayılan ver
kategori = urun.get('kategori') or {}
kategori_adi = kategori.get('ad', '')
stok = urun.get('stok', 0)

get() için varsayılan değer, alanın sonraki kullanımına uygun türde seçilir. Stok sayısal karşılaştırmada kullanılacağı için 0, kategori üzerinde tekrar .get() çağrılacağı için boş sözlük, kategori adı metinle karşılaştırılacağı için '' uygundur. Bir anahtar mevcutsa fakat değeri None ise get() yöntemine verilen varsayılan bağımsız değişken devreye girmez. Bu nedenle or {} gibi bir normalizasyon veya açık tür kontrolü gerekebilir. Kategori değeri liste, sayı ya da başka bir hatalı türse get() bunu kendiliğinden düzeltmez. Stok için de None veya metin geldiğinde karşılaştırmadan önce tür kontrolü yapmalısın.

for döngüsü mü, liste üreteci mi? loads ve load farkı

JSON verisi önce json.loads() ya da json.load() ile Python listesine veya sözlüğüne ayrıştırılır, filtreleme bu yapı üzerinde yapılır. Tek ve açık bir koşulda liste üreteci seçimi tek ifadede toplar, ara değerleri adlandırmak, birden fazla kontrolü görmek veya hata ayıklamak gerektiğinde ise for döngüsü daha okunaklı olabilir.

Stokta olan ve kategorisi aksesuar olan ürünleri seçen kısa liste üreteci örneği şöyledir:

import json

json_metni = '[{"ad": "Kablo", "stok": 3, "kategori": {"ad": "aksesuar"}}, {"ad": "Defter", "stok": 0, "kategori": {"ad": "aksesuar"}}, {"ad": "Fare", "stok": 2}]'
urunler = json.loads(json_metni)

uygun_urunler = [urun for urun in urunler if urun.get('stok', 0) > 0 and (urun.get('kategori') or {}).get('ad', '') == 'aksesuar']

print([urun['ad'] for urun in uygun_urunler])
print(json.dumps(uygun_urunler, ensure_ascii=False))

get('stok', 0) ifadesi, stok anahtarı yoksa karşılaştırmada kullanılacak varsayılan değeri belirler. (urun.get('kategori') or {}) yapısı da kategori anahtarı eksik veya değeri boş olduğunda iç içe get() çağrısının güvenli biçimde çalışmasına yardımcı olur.

  • Ara değerleri adlandırmak, birden fazla doğrulama yapmak veya hata ayıklamak gerekiyorsa for döngüsünü seç.
  • Tek ve açık bir koşul varsa liste üretecini seç.
  • İç içe erişim ifadeyi uzatıyorsa okunabilirlik için for döngüsüne dön.

Filtreleme akışında json.loads() ile json.load() arasındaki fark, girdinin kaynağıdır. JSON metni bir değişkende duruyorsa json.loads(json_metni), dosya benzeri bir girdiden okunuyorsa json.load(dosya) kullanılır. Her iki durumda da kök yapı listeyse aynı filtre koşulunu uygulayabilirsin. Filtrelenmiş Python listesini JSON metnine çevirmek için json.dumps(uygun_urunler, ensure_ascii=False) çağrısı JSON biçiminde bir metin üretir.

Yukarıdaki örneğin beklenen çıktısı şöyledir:

['Kablo']
[{"ad": "Kablo", "stok": 3, "kategori": {"ad": "aksesuar"}}]

Liste, sözlük ve koşul bilgini farklı örneklerle pekiştirmek için Python bilgi testi sorularını da çözebilirsin.

Sık Sorulan Sorular

JSON verisi liste yerine tek bir sözlük olduğunda filtreleme yaklaşımı nasıl değişir?

Önce sözlüğün tek bir ürünü mü, yoksa ürün listesini taşıyan bir kapsayıcı mı olduğunu belirle. Ürünler bir alanın içindeyse urunler = veri.get('urunler') or [] ile listeyi çıkarıp aynı filtreyi uygulayabilirsin. Sözlük tek ürünü temsil ediyorsa koşulu doğrudan bu sözlük üzerinde değerlendirmek yeterlidir.

İç içe alanlardan biri eksikse get() için hangi varsayılan değer seçilmelidir?

Varsayılan değer, yapılacak işlemin beklediği türle uyumlu olmalıdır. Sayısal karşılaştırmalarda 0, metin karşılaştırmalarında '', iç içe sözlük erişiminde ise {} kullanılabilir. Değerin None olma ihtimali varsa (deger or {}) biçiminde bir koruma eklenebilir.

json.loads() ile json.load() arasındaki fark filtreleme kodunu nasıl etkiler?

Filtre koşulunu genellikle değiştirmez. Yalnızca ayrıştırma satırı değişir: metin için json.loads(json_metni), dosya benzeri giriş için json.load(dosya) kullanılır. Sonuçta Python listesi elde ediliyorsa aynı for döngüsü veya liste üreteci kullanılabilir.

Filtrelenmiş Python listesi yeniden JSON metnine nasıl dönüştürülür?

json_metni = json.dumps(uygun_urunler, ensure_ascii=False) satırı, filtrelenmiş Python listesini JSON biçimindeki bir metne dönüştürür. ensure_ascii=False seçeneği, Türkçe karakterlerin çıktıda doğrudan görünmesine yardımcı olur.

Sağlam bir filtreleme akışı için önce JSON yapısını tanı, sonra eksik alanları uygun varsayılanlarla kontrol et ve okunabilirliği koruyan yaklaşımı seç.

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