Python'da JSON verisi okumak için yerleşik json modülünün json.load() (dosyadan) veya json.loads() (metinden) fonksiyonları kullanılır. Yazmak için ise aynı modülün json.dump() ve json.dumps() fonksiyonlarına başvurulur. Bu dört fonksiyon, JSON formatındaki verinin Python sözlük ve listelerine dönüştürülmesini (ve tersini) tek satırlık kod bloklarıyla mümkün kılar.
Aşağıda JSON'ın ne olduğunu, json modülünün temel yapısını ve dosyadan JSON okuma işlemini örneklerle inceleyeceğiz.
JSON Nedir?
JSON (JavaScript Object Notation), verileri anahtar-değer çiftleri ve listeler halinde saklayan, insan tarafından okunabilir metin tabanlı bir veri formatıdır. Adında "JavaScript" geçse de dile bağımlı değildir; Python, JavaScript, Java, PHP gibi neredeyse tüm modern dillerde desteklenir. Bu yüzden JSON, farklı sistemler ve programlama dilleri arasında veri değişimi için fiili standart haline gelmiştir.
Python tarafında JSON, genellikle iki senaryoda karşımıza çıkar: bir web API'sinden gelen yanıtı işlemek veya bir yapılandırma/veri dosyasını (.json) okuyup yazmak. Her iki durumda da JSON verisi, Python'ın dict ve list nesnelerine birebir karşılık gelir; bu da onu Python ile kullanmayı oldukça doğal kılar.
Python'da JSON Modülü
Python, JSON işlemleri için ekstra bir kütüphane kurmaya gerek bırakmayan json modülünü standart kütüphanesinde barındırır. Kullanmaya başlamak için tek yapılması gereken modülü import etmektir:
import json
json modülünün dört temel fonksiyonu vardır ve isimlendirmeleri işlevlerini net şekilde yansıtır:
json.load()Açık bir dosya nesnesinden JSON verisi okur ve Python nesnesine çevirir.json.loads()Bir JSON string'ini (metnini) Python nesnesine çevirir (sonundaki "s" "string" anlamına gelir).json.dump()Python nesnesini JSON formatında bir dosyaya yazar.json.dumps()Python nesnesini JSON formatında bir string'e çevirir.
Bu dört fonksiyonu ayırt etmenin kolay yolu şudur: "load" okuma, "dump" yazma işlemidir; sonunda "s" varsa işlem dosya üzerinde değil, string üzerinde yapılır.
JSON Dosyası Okuma (json.load)
Diskte duran bir .json dosyasını okumak için json.load() fonksiyonu kullanılır. Bu fonksiyon dosya yolunu değil, open() ile açılmış bir dosya nesnesini parametre olarak bekler. Örnek bir veri.json dosyası şu içeriğe sahip olsun:
{
"isim": "Ahmet",
"yas": 28,
"sehir": "İstanbul"
}
Bu dosyayı okumak için:
import json
with open("veri.json", "r", encoding="utf-8") as dosya:
veri = json.load(dosya)
print(veri)
print(veri["isim"])
Bu kod çalıştırıldığında veri değişkeni bir Python sözlüğüne (dict) dönüşür ve veri["isim"] ile "Ahmet" değerine doğrudan erişilebilir. Burada iki noktaya dikkat etmek gerekir:
encoding="utf-8"parametresi, Türkçe karakterler (ı, ş, ğ, ü gibi) içeren dosyalarda okuma hatalarını önlemek için mutlaka belirtilmelidir. Özellikle Windows ortamında varsayılan encoding farklı olabildiğinden bu parametre atlanmamalıdır.withbloğu kullanmak, dosyanın işlem sonunda otomatik olarak kapatılmasını garanti eder ve dosya sızıntılarını önler.
Dosya bulunamazsa FileNotFoundError, içerik geçersiz JSON ise json.JSONDecodeError hatası fırlatılır; bu hataları yakalamak isteyen bir try/except bloğu eklemek üretim kodunda iyi bir pratiktir.
JSON String Ayrıştırma (json.loads)
Bazen JSON verisi dosyada değil, doğrudan bir string olarak elinizde bulunur. Örneğin bir API'den gelen yanıt veya bir metin alanından okunan veri. Bu durumda json.load() yerine json.loads() kullanılır (dikkat: sonundaki "s" string anlamına gelir).
import json
json_str = '{"isim": "Ayşe", "yas": 28, "sehir": "İzmir"}'
data = json.loads(json_str)
print(data["isim"]) # Ayşe
print(type(data)) # <class 'dict'>
json.loads() bir dosya değil, JSON formatındaki bir string alır ve onu Python nesnesine (dict, list vb.) çevirir. Aradaki fark sadece bu: load dosya nesnesiyle, loads string ile çalışır. İkisi de aynı dönüşüm mantığını kullanır, JSON'daki obje Python'da dict'e, dizi liste'ye, sayılar int/float'a dönüşür.
JSON Dosyasına Yazma (json.dump)
Python nesnesini JSON formatında bir dosyaya kaydetmek için json.dump() fonksiyonu kullanılır. Kullanımı okumaya çok benzer, sadece yön tersine döner.
import json
veri = {
"isim": "Mehmet",
"yas": 35,
"sehir": "Ankara",
"aktif": True
}
with open("kisi.json", "w", encoding="utf-8") as dosya:
json.dump(veri, dosya, indent=4, ensure_ascii=False)
Burada iki parametre öne çıkıyor:
indent=4: Çıktıyı 4 boşluk girintili, okunabilir bir formatta yazar. Belirtilmezse tüm veri tek satırda sıkışık şekilde yazılır. Debug ve dosyayı manuel kontrol etmek için indent kullanmak işi kolaylaştırır.ensure_ascii=False: Varsayılan olarakjson.dump()Türkçe karakterler gibi ASCII dışı karakterleriu00e7gibi unicode kaçış dizilerine çevirir.ensure_ascii=Falseverirseniz "ş", "ç", "ğ" gibi karakterler dosyada olduğu gibi görünür.
String olarak JSON üretmek isterseniz json.dumps() (sondaki "s" ile) kullanılır, dosyaya yazmadan sadece string döndürür. Mantık load/loads ile aynı.
Sık Yapılan Hatalar
JSON ile çalışırken karşılaşılan hatalar genelde üç kategoride toplanır:
Encoding hataları: Dosya açarken encoding="utf-8" belirtilmezse, özellikle Windows'ta Türkçe karakterler bozuk görünebilir veya UnicodeDecodeError alınabilir. Hem okuma hem yazma işlemlerinde encoding="utf-8" parametresini eklemek bu sorunu önler.
Tip uyumsuzlukları: JSON formatı Python'daki her veri tipini desteklemez. Örneğin bir set veya datetime nesnesini doğrudan json.dump() ile yazmaya çalışırsanız TypeError: Object of type set is not JSON serializable hatası alırsınız. Bu tip verileri önce liste veya string gibi JSON'un desteklediği bir tipe çevirmek gerekir.
Dosya yolu hataları: json.load() ile var olmayan bir dosya açılmaya çalışılırsa FileNotFoundError fırlatılır. Ayrıca dosya var ama içeriği geçersiz JSON ise (eksik virgül, kapanmamış parantez gibi) json.JSONDecodeError alınır. Bu hataları try-except bloklarıyla yakalamak, özellikle dış kaynaklardan gelen veriyle çalışırken programın çökmesini önler.
Sık Sorulan Sorular
Python'da JSON dosyasını nasıl okurum?
Dosyayı open() ile açıp json.load() fonksiyonuna vermeniz yeterli. Bu fonksiyon dosya içeriğini otomatik olarak Python sözlüğüne veya listesine dönüştürür:
import json
with open("veri.json", "r", encoding="utf-8") as f:
data = json.load(f)
json.load ile json.loads arasındaki fark nedir?
json.load() doğrudan bir dosya nesnesi bekler ve dosyayı okuyarak veriyi dönüştürür. json.loads() ise elinizde zaten bulunan bir JSON string'ini (metin) dönüştürür. Yani biri dosyayla, diğeri string'le çalışır. API yanıtları gibi bellekteki metinlerde loads(), dosya işlemlerinde load() kullanılır.
JSON dosyasına Türkçe karakterler nasıl doğru yazılır?
Varsayılan olarak json.dump(), ASCII dışı karakterleri (ç, ş, ğ, ı, ö, ü gibi) unicode kaçış dizilerine çevirir. Bunu önlemek için ensure_ascii=False parametresini kullanmanız ve dosyayı encoding="utf-8" ile açmanız gerekir:
with open("veri.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=4)
JSON verisi geçersizse Python hata verir mi?
Evet. Söz dizimi hatalı bir JSON verisi okumaya çalıştığınızda Python json.JSONDecodeError istisnasını fırlatır. Bu durumu try/except bloğuyla yakalayarak programın çökmesini önleyebilir ve kullanıcıya anlamlı bir hata mesajı gösterebilirsiniz.
JSON okuma ve yazma işlemleri Python'da json modülü sayesinde oldukça sade bir şekilde yapılabiliyor. Temel fonksiyonları ve olası hataları bilmek, veriyle çalışırken karşınıza çıkabilecek çoğu sorunu kolayca çözmenizi sağlar.