İçeriğe geç

Menü

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

Python "json.dumps" ve "json.loads" Farkı Nedir? Örneklerle

python-json-dumps-json-loads-farki
Bu yazıda neler var?
  1. dumps ve loads sonundaki "s" harfi ne anlama gelir?
  2. Bir sözlüğü metne çevirip geri alma: adım adım örnek
  3. API'den gelen metin loads ile nasıl Python nesnesine dönüşür?
  4. Python sözlüğü ile JSON metni neden aynı görünmez?
  5. Hangi fonksiyonu seçmeli? Üç soruluk kontrol listesi

Python json.dumps ve json.loads farkı tek cümleyle şöyle: json.dumps bir Python nesnesini (sözlük, liste gibi) JSON metnine çevirir, json.loads ise JSON metnini tekrar Python nesnesine çevirir. İki fonksiyon birbirinin tersini yapar. Adlardaki sondaki s harfi string yani metin anlamına gelir ve hangi fonksiyonun neyle çalıştığını hatırlamanın en kolay yoludur.

dumps ve loads sonundaki "s" harfi ne anlama gelir?

Sondaki s, fonksiyonun bir str (metin) ile çalıştığını gösterir. dumps çıktı olarak metin üretir, loads girdi olarak metin alır. Python dokümantasyonundaki ayrım da buna dayanır: dumps ve loads metin üzerinde çalışır, dump ve load ise dosya benzeri nesnelerle kullanılır.

s harfi olmayan ikili de aynı işi dosya üzerinden yapar. json.dump Python nesnesini JSON olarak bir dosyaya yazar, json.load ise bir dosyayı okuyup Python nesnesine çevirir. Bu ikiliyle ilgili akılda tutman gereken tek şey, metin yerine dosya nesnesi (örneğin open() ile açtığın dosya) kullanmalarıdır.

Fonksiyon Dönüşüm yönü Girdi türü Çıktı türü Tipik kullanım
json.dumps Python nesnesi → JSON metni dict, list vb. str Veriyi ekrana yazdırmak ya da bir yere metin olarak göndermek
json.loads JSON metni → Python nesnesi str dict, list vb. Metin olarak gelen veriyi Python'da kullanmak
json.dump Python nesnesi → dosya Nesne ve açık dosya Yok, dosyaya yazar Veriyi .json dosyasına kaydetmek
json.load Dosya → Python nesnesi Açık dosya dict, list vb. Kayıtlı .json dosyasını okumak

Bir sözlüğü metne çevirip geri alma: adım adım örnek

Bir sözlüğü metne çevirip geri alma: adım adım örnek

Farkı en net, türleri type() ile kontrol ederek görürsün. Önce bir sözlük tanımlayalım.

Adım 1: Sözlük tanımla

import json

kisi = {"ad": "Elif", "yas": 15}
print(type(kisi))

Beklenen çıktı:

<class 'dict'>

Adım 2: dumps ile metne çevir

metin = json.dumps(kisi)
print(metin)
print(type(metin))

Beklenen çıktı:

{"ad": "Elif", "yas": 15}
<class 'str'>

Ekranda sözlüğe benziyor ama metin artık düz bir str. Bu yüzden metin['ad'] yazarsan Python TypeError verir. Metnin içinde anahtar yoktur, yalnızca karakterler vardır.

Adım 3: loads ile geri al

geri = json.loads(metin)
print(type(geri))
print(geri["ad"])

Beklenen çıktı:

<class 'dict'>
Elif

Artık anahtarla erişim çalışıyor, çünkü loads metni yeniden gerçek bir sözlüğe çevirdi.

Liste ile kısa bir ek örnek

diller = ["Python", "Java"]
print(json.dumps(diller))

Beklenen çıktı:

["Python", "Java"]

Liste, köşeli parantezli bir JSON metnine dönüşür ve bu çıktı da yine bir str'dir. Böylece üç türü ayırabilirsin: str metindir, dict anahtar-değer çiftleridir, list sıralı değerlerdir. Yeni öğrendiğin türleri ve fonksiyonları denemek istersen ücretsiz Python bilgi testiyle seviyeni ölçebilirsin.

API'den gelen metin loads ile nasıl Python nesnesine dönüşür?

API'den gelen metin loads ile nasıl Python nesnesine dönüşür?

Bir API yanıtı ağ üzerinden Python nesnesi olarak değil, düz metin olarak gelir. Bu metin JSON biçimindedir ama Python açısından yalnızca bir str değeridir. Anahtarla erişebilmek için önce json.loads ile dict ya da list türüne çevirmen gerekir. Aşağıdaki örnekte gerçek bir istek atmıyoruz. Yanıt gövdesini temsil eden sabit bir metin kullanıyoruz.

import json

govde = '{"kullanici": {"ad": "Elif", "okul": "Lise"}, "puan": 85}'

veri = json.loads(govde)
print(type(veri))
print(veri["kullanici"]["ad"])
print(veri["puan"] + 5)

Beklenen çıktı:

<class 'dict'>
Elif
90

Çözülmüş veride iç içe alana veri["kullanici"]["ad"] ile ulaşılır ve puan gerçek bir sayı olduğu için toplama yapılabilir. govde değişkenine aynı şekilde ["puan"] yazsaydın, bir metnin içinde anahtar aradığın için hata alırdın.

İstekleri requests kütüphanesiyle atarsan yanıtın gövdesi yine metindir. Yanıt nesnesinin .json() yöntemi bu metni Python nesnesine çevirir. Mantık aynıdır: metin gelir, nesne çıkar.

Python sözlüğü ile JSON metni neden aynı görünmez?

İkisi ilk bakışta benzer, ama JSON ayrı bir metin biçimidir. Kuralları Python'dan farklıdır. Anahtarlar ve metinler çift tırnakla yazılır, mantıksal değerler küçük harfle yazılır ve None yerine null kullanılır. Aşağıdaki örnek farkları yan yana gösterir.

import json

ogrenci = {"ad": "Şule", "aktif": True, "mezuniyet": None, "dersler": ("Python", "Java")}

print(ogrenci)
metin = json.dumps(ogrenci)
print(metin)
print(json.dumps(ogrenci, ensure_ascii=False))

geri = json.loads(metin)
print(geri["dersler"])

Beklenen çıktı:

{'ad': 'Şule', 'aktif': True, 'mezuniyet': None, 'dersler': ('Python', 'Java')}
{"ad": "u015eule", "aktif": true, "mezuniyet": null, "dersler": ["Python", "Java"]}
{"ad": "Şule", "aktif": true, "mezuniyet": null, "dersler": ["Python", "Java"]}
['Python', 'Java']

İlk satır print(ogrenci) çıktısıdır: tek tırnaklı, True ve None içeren bir Python görünümü. İkinci satır geçerli JSON metnidir: çift tırnak, true ve null kullanır.

Tuple list olarak geri döner

JSON'da tuple karşılığı yoktur. dumps tuple'ı köşeli parantezli bir diziye çevirir. loads bu diziyi geri okuyunca sonuç list olur. Dönüşüm gidiş dönüşte birebir aynı türü geri vermez.

Türkçe karakterler ve ensure_ascii

ensure_ascii varsayılan olarak True olduğu için ş, ğ, ı gibi harfler u015e biçiminde kaçış dizisine dönüşür. Veri yine geçerlidir ve loads bunu doğru okur, ama gözle okunmaz. ensure_ascii=False yazarsan harfler olduğu gibi kalır.

Hatalı biçimi loads'a vermek de bir yanlış anlamadır. print(ogrenci) çıktısını kopyalayıp loads'a verirsen tek tırnaklar JSON kuralına uymadığı için Python hata verir. Metni JSON olarak üretmek için dumps kullanman gerekir.

Hangi fonksiyonu seçmeli? Üç soruluk kontrol listesi

Kod yazarken şu üç soruyu sırayla sor. Cevapların hangi fonksiyonu seçeceğini kendiliğinden gösterir.

  1. Elimde ne var? Python nesnesi (sözlük, liste) varsa ve bunu JSON'a çevireceksen dumps, elinde JSON metni varsa ve bunu Python'da kullanacaksan loads kullanılır.
  2. Sonuç nerede duracak? Metin bellekte, bir değişkende kalacaksa dumps ve loads yeterlidir. Veri bir dosyaya yazılacak ya da dosyadan okunacaksa dump ve load (sonunda s yok) kullanılır.
  3. Türkçe karakterler okunur kalmalı mı? Evetse ensure_ascii=False ekle. Varsayılan davranışta ş, ğ, ı gibi harfler u015f biçiminde kaçış koduna dönüşür.
import json

ogrenci = {"ad": "Şule", "sinif": 9}
print(json.dumps(ogrenci))
print(json.dumps(ogrenci, ensure_ascii=False))

Beklenen çıktı:

{"ad": "u015eule", "sinif": 9}
{"ad": "Şule", "sinif": 9}

Hatırlama ipucu: s = string. Fonksiyona metin giriyorsa ya da fonksiyondan metin çıkıyorsa s'li olanı seç. Dosya söz konusuysa s'siz olanı seç.

Bu karar adımlarını biraz pratikle ezbersiz kullanırsın. Python'a yeni başlıyorsan ücretsiz Sıfırdan Temel Python video eğitimi sözlük, liste ve fonksiyon temellerini kendi hızında çalışmak için iyi bir başlangıç olabilir.

Kısacası dumps ve loads aynı köprünün iki yönüdür. Hangi tarafta durduğunu bildiğinde doğru fonksiyonu seçmek zorlaşmaz.

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