Menu

Python JSON: json Modülü ile JSON Okuma, Yazma ve Ayrıştırma

Python'da JSON'u nasıl okur ve yazarsın — loads, dumps, dosyadan okuma, süslü yazdırma ve gerçek verideki uç durumları yönetme.

JSON ve Python Aynı Şekillerden Konuşur

JSON, web üzerindeki API'ler, konfig dosyaları ve veri alışverişi için varsayılan formattır. Python programcıları için şanslı olan şu: bir JSON nesnesi doğrudan Python dict'ine, bir JSON dizisi bir liste'ye, bir JSON string'i bir str'ye oturur. Bu sıkı hizalama, Python'da JSON okuma ve yazmanın iki satırlık bir iş olmasının sebebi.

Standart kütüphanedeki json modülü her iki yönü de halleder.

Bir JSON String'ini Ayrıştırmak

json.loads(text) — "load string" — bir JSON formatlı string alır ve temsil ettiği Python nesnesini döndürür:

main.py
Output
Click Run to see the output here.

Sonuç düz bir dict'tir. Anahtarlarına herhangi bir dict gibi erişirsin — özel JSON sarmalayıcısı yok, sonuç üzerinde .parse() metodu yok.

String geçerli JSON değilse, json.loads json.JSONDecodeError fırlatır. Hata mesajı, sorunun satır ve sütun numarasını içerir; eksik virgül ya da kaçış karakteri konmamış tırnak bulmaya genelde bu yeter.

JSON'u String Olarak Yazmak

json.dumps(data) — "dump string" — tam tersini yapar: bir Python nesnesi alır ve bir JSON string'i döndürür:

main.py
Output
Click Run to see the output here.

Python'un True, False ve None değerleri otomatik olarak JSON'un true, false ve null'ına çevrilir. Sayılar ve string'ler olduğu gibi geçer. Listeler dizilere, dict'ler nesnelere dönüşür.

Süslü Yazdırma

json.dumps'ın varsayılan çıktısı sıkıştırılmıştır — ağ üzerinde taşımak için uygun, insan gözü için zor. Daha okunaklı bir şey için indent=2 geç:

main.py
Output
Click Run to see the output here.

Bilmeye değer birkaç dumps seçeneği daha:

  • sort_keys=True — nesne anahtarlarını alfabetik sırala. Deterministik çıktı için kullanışlı (konfig dosyaları, test fixture'ları, diff'ler).
  • ensure_ascii=False — ASCII olmayan karakterleri (é, ü, 中) \u kaçışları yerine oldukları gibi yaz. UTF-8 dosyalar için genelde doğru tercih.
  • separators=(",", ":") — mümkün olan en sıkı çıktı. ensure_ascii=False ile birleşince, üretebileceğin en kompakt UTF-8 JSON'u verir.

Dosyadan JSON Okumak

json.load(file)s yok — doğrudan bir dosya nesnesinden okur. Yaygın kalıp bunu with open ile eşleştirir:

import json

with open("config.json") as f:
    config = json.load(f)

print(config["version"])

Önce tüm dosyayı bir string'e almana gerek yok; json.load dosya nesnesi üzerinden akış olarak geçer.

Dosyaya JSON Yazmak

json.dump(data, file), dosya-yazma karşılığıdır:

import json

data = {"created": "2026-01-01", "items": [1, 2, 3]}

with open("state.json", "w") as f:
    json.dump(data, f, indent=2)

indent seçeneği burada da çalışır. Oluşan dosyayı aç, güzel biçimlendirilmiş bir JSON dokümanı göreceksin.

Bir JSON API Yanıtını Okumak

Çoğu HTTP kütüphanesi sana byte ya da metin uzatır; onları kullanılabilir veriye çevirmek için json.loads çağırırsın:

import json
import urllib.request

with urllib.request.urlopen("https://api.example.com/users/1") as response:
    text = response.read().decode("utf-8")

user = json.loads(text)
print(user["name"])

requests kütüphanesi (ayrı olarak anlatılıyor) bir adımı atlar — yanıt üzerinde json.loads'u senin için çağıran bir .json() metodu vardır.

JSON Ne Temsil Edebilir, Ne Edemez

JSON'un tip sistemi Python'unkinden dardır. Her iki yöndeki eşleme:

PythonJSON
dictobject
list, tuplearray
strstring
int, floatnumber
Truetrue
Falsefalse
Nonenull

Tuple'lar liste olarak gidip gelir — tuple'lık kaybolur. Set'ler, özel sınıflar ve datetime nesneleri varsayılan olarak serileştirilemez; TypeError: Object of type X is not JSON serializable alırsın.

datetime ve Özel Nesneleri Yönetmek

İki yaygın yaklaşım.

Önce JSON-uyumlu bir yapıya çevir. Dönüşümü kendi kodunda yap, sonra düz bir dict'i serileştir:

main.py
Output
Click Run to see the output here.

Bir default= fonksiyonu geç. json.dumps bunu, nasıl serileştireceğini bilmediği her değer için çağırır:

main.py
Output
Click Run to see the output here.

Veriyi okurken bu ISO string'leri datetime'a kendin çevirmen gerekir — JSON onların aslen ne olduğunu hatırlamaz.

Bir Dict'i JSON Üzerinden Gidip Getirmek

Dict'lerin sağ salim döndüğünü hızlı bir test:

main.py
Output
Click Run to see the output here.

Değerler eşittir ama farklı nesnelerdir. Genelde istediğin de budur — json.dumps + json.loads, JSON-uyumlu herhangi bir yapının derin bir kopyasını yapmanın ucuz bir yoludur.

Gerçekçi Bir Örnek

Bir JSON konfigürasyonu yükleyen, bir alanı güncelleyen ve geri kaydeden küçük bir script:

import json
from pathlib import Path

config_path = Path("settings.json")

# Yükle (dosya yoksa bir varsayılanla).
if config_path.exists():
    config = json.loads(config_path.read_text())
else:
    config = {"theme": "dark", "last_opened": None}

# Güncelle.
config["last_opened"] = "2026-01-15"

# Düzgün biçimlendirilmiş olarak kaydet.
config_path.write_text(json.dumps(config, indent=2, ensure_ascii=False))

Bu, bir düzine satırda eksiksiz bir "oku, değiştir, yaz" JSON döngüsü.

Birkaç Alışkanlık

  • Dosyalar için her zaman with open(...) kullan. JSON da metindir; tüm dosya-işleme kuralları geçerli.
  • İnsan gözünün okuyacağı dosyalarda indent=2'yi tercih et — konfig, fixture, dışa aktarılmış veri. Kompaktlığın önemli olduğu ağ trafiğinde atla.
  • UTF-8 çıktı için ensure_ascii=False'u aç ki vurgulu ya da Latin dışı karakterlere sahip isimler okunaklı kalsın.
  • Sen üretmediğin veriyi ayrıştırırken try/except json.JSONDecodeError ile doğrula.

Sırada

JSON anahtar-değer verisini halleder. Aynı bölümdeki bir sonraki araç CSV — karşılaşacağın çoğu tablosal format dışa aktarımı için Python'un yerleşik desteği.

Sıkça Sorulan Sorular

Python'da JSON'u nasıl ayrıştırırım?

JSON string'i için json.loads(text), dosya nesnesi için json.load(file) kullan. İkisi de bir Python dict (ya da JSON'a göre list) döndürür. Örnek: data = json.loads('{"name": "Rosa"}')data['name'] 'Rosa' olur.

Bir Python sözlüğünü JSON'a nasıl çeviririm?

json.dumps(my_dict) bir JSON string döndürür. json.dump(my_dict, file) doğrudan dosya nesnesine yazar. Süslü çıktı için indent=2 ver: json.dumps(data, indent=2).

json.loads ile json.load arasındaki fark nedir?

loads (sonunda s var) bir string alır. load (s yok) bir dosya nesnesi alır. dumps ile dump için de aynı. s, string içindir; hangisinin hangisi olduğunu hatırlamanın en kolay yolu budur.

JSON'da tarihleri ve özel nesneleri nasıl yönetirim?

JSON'un tarih tipi yok, yani tarihleri ISO-8601 string olarak geçir ve okurken manuel ayrıştır. Özel sınıflar için ya json.dumps'a JSON-uyumlu bir temsil döndüren bir default= fonksiyonu ver ya da serileştirmeden önce elle bir dict'e çevir.

Coddy ile kodlamayı öğren

BAŞLA