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?

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.
- 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.
- Eksik alanları planla:
stok,kategoriveya içtekiadanahtarı 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 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
fordö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
fordö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ç.