JSON’da tıpkı XML gibi farklı yazılım dilleri ve sistemler arasında veri alışverişini sağlayan biçimlendirilmiş bir veri taşıma formatıdır. Gerçek hayat uygulamalarında genellikle API’ler ile çalışırken XML ile birlikte en çok karşınıza çıkan veri formatıdır. Python’da JSON formatı ile çalışmak için hazır gelen json modülü mevcuttur.

Eğer elinizde JSON formatında bir dosya mevcut ise, tıpkı standart bir metin dosyasını okur gibi with..as bağlam yöneticisini kullanarak dosyayı okuyabiliriz, ancak tek bir farkla metin okurken kullandığımız read() metodu yerine json modülünün load() metodunu kullanırız. Okuduğunuz veri Python sözlük formatına dönüşecektir. Dolayısıyla sözlük verileri ile gerçekleştirdiğimiz işlemleri JSON verisini aktardığımız değişken üzerinde de gerçekleştirebiliriz.

Sözlükler içindeki verilere indeks olarak kullanılan anahtarlar aracılığıyla ulaşabildiğimizi hatırlıyorsunuzdur. Burada da bu özellikten faydalanarak JSON dosyası içindeki verilere erişip kullanabiliriz.

Örnek JSON dosyamız veriler.json adıyla çalışma klasörümüz içinde kaydedilmiş olsun. İçindeki veriler de şu şekilde olsun;

{
    "Kırtasiye":
        {
            "Kalemler":
        {
              	"urun_adi": "Rotring Tikky Versatil Kalem 0,9",
              	"fiyat": 27.99,
              	"aciklama": "Yazım ve çizim yapmak için son derece uygun bir model olan   Rotring Tikky 1904507 Mekanik Kurşun Kalem 0.9 mm, başta öğrenciler olmak   üzere sık kalem kullanımı yapan kişilere hitap ediyor."
              },
      "Silgiler":        
                [
          {
              	  "urun_adi": "Faber-Castell 3'lü Büyük Beyaz Silgi",
                      "fiyat": 12.50,
                      "aciklama": "PVC içermeyen, kalıntı bırakmayan, sınavlarda kullanıma uygun silgi seti."
                  },
          {
  					"urun_adi": "Castellini Beyaz Tahta Silgisi",
      				"fiyat": 45.90,
          			"aciklama": "Sınıflarda beyaz tahtalarda kullanıma uygun, kendinden manyetik yapışkanlı silgi."
                  }
        ],
      "Defterler":
        {
              	"urun_adi": "Gıpta Prizma Bloknot Kareli 100 Yaprak A4",
              	"fiyat": 19.90,
              	"aciklama": "Gıpta Prizma Bloknot * 60 Gr Kağıt * Ofset Baskılı * Spiralli  Bloknot * A4 - A5 boyutunda 100 yaprak kareli defter."
              }
        }
}

 

Bu dosyayı Python ile okuyalım ve içindeki bir veriye erişelim;

import json

# JSON dosyasını okuyalım
with open("veriler.json") as dosyam:
  verilerimiz=json.load(dosyam)

# Dosya içindeki bir veriyi ekrana yazdıralım.Sözlükler içindeki verilere indeks olarak kullanılan anahtarlar aracılığıyla ulaşabiliriz.
print(verilerimiz["Kırtasiye"]["Defterler"]["urun_adi"])

Çıktı:

Gıpta Prizma Bloknot Kareli 100 Yaprak A4

 

Eğer bir dosyadan okumuyorsanız ve JSON formatındaki veri kodunuzun içine dahil ise load() metodu yerine loads() metodu kullanılır;

urunler='{"Kırtasiye":{"Kalemler":{"urun_adi": "Rotring Tikky Versatil Kalem 0,9","fiyat": 27.99,"aciklama": "Yazım ve çizim yapmak için son derece uygun bir model olan   Rotring Tikky 1904507 Mekanik Kurşun Kalem 0.9 mm, başta öğrenciler olmak   üzere sık kalem kullanımı yapan kişilere hitap ediyor."}}}'

verilerimiz=json.loads(urunler)
print(verilerimiz["Kırtasiye"]["Kalemler"])

Çıktı:

{'urun_adi': 'Rotring Tikky Versatil Kalem 0,9', 'fiyat': 27.99, 'aciklama': 'Yazım ve çizim yapmak için son derece uygun bir model olan Rotring Tikky 1904507 Mekanik Kurşun Kalem 0.9 mm, başta öğrenciler olmak üzere sık kalem kullanımı yapan kişilere hitap ediyor.'}

 

Burada, JSON biçimlendirmesi ile yazılmış ancak metin formatındaki veriyi loads() metodu ile okuyarak uygulamamız içinde JSON olarak verilere erişme şansı elde ettik.

Python içindeki veri türlerini de json modülünün dumps() metodu ile JSON formatına dönüştürebiliriz.

Örneğin elimizde sözlük formatında bir veri olduğunu düşünelim;

personel={
  'ad-soyad': 'Mert Demir',
  'yas': 28,
  'deneyim': 8,
  'arayuzDili': 'VueJS',
  'sunucuDili': 'Python'
}

jsonVerisi=json.dumps(personel)

print(jsonVerisi)

Çıktı:

{"ad-soyad": "Mert Demir", "yas": 28, "deneyim": 8, "arayuzDili": "VueJS", "sunucuDili": "Python"}

 

Sadece sözlük formatındaki verileri değil, birçok Python veri türünü JSON formatına çevirebilirsiniz. Python ile JSON yapabileceğiniz veri türleri, yani Python veri türlerinin Javascript’teki karşılığı şunlardır;

PythonJSON
dictObject
listArray
tupleArray
strString
intNumber
floatNumber
Truetrue
Falsefalse
Nonenull

Buradaki tüm veri türlerinin içinde bulunduğu bir örnek ile JSON formatına dönüştürme işlemimizi tekrar görelim;

personel={
  'Adı Soyadı': 'Mert Demir', # str formatından string formatına
  'Deneyim': 8, # int formatından Number formatına
  'Programlama Dilleri':[
    {'Arayüz Dili': 'VueJS', 'Arayüz Deneyimi': 2},
    {'Sunucu Dili': 'Python', 'Sunucu Deneyimi': 8}
  ], # Liste formatından Dizi formatına
  'Ek Prim': True, # Boolean formatından Boolean formatına
  'Fazla Mesai':False, # Boolean formatından Boolean formatına
  'Tatil Günleri': ('Çarşamba','Pazar') # Demet formatından Dizi formatına
}

jsonVerisi=json.dumps(personel)

print(jsonVerisi)

Çıktı:

{"Ad\u0131 Soyad\u0131": "Mert Demir", "Deneyim": 8, "Programlama Dilleri": [{"Aray\u00fcz Dili": "VueJS", "Aray\u00fcz Deneyimi": 2}, {"Sunucu Dili": "Python", "Sunucu Deneyimi": 8}], "Ek Prim": true, "Fazla Mesai": false, "Tatil G\u00fcnleri": ["\u00c7ar\u015famba", "Pazar"]}

Ancak bu çıktı alışkın olduğumuz okunabilir JSON formatına pek benzemiyor. Alt satıra geçmeden ve hiyerarşik yapıyı girintilerle vurgulamadan görünüyor. Göze daha okunabilir görünmesi için dumps() metoduna girinti parametresi olan indent=4 gibi bir parametre vermeliyiz.

jsonVerisi=json.dumps(personel, indent=4)

Çıktı:

{
    "Ad\u0131 Soyad\u0131": "Mert Demir",
    "Deneyim": 8,
    "Programlama Dilleri": [
        {
            "Aray\u00fcz Dili": "VueJS",
            "Aray\u00fcz Deneyimi": 2
        },
        {
            "Sunucu Dili": "Python",
            "Sunucu Deneyimi": 8
        }
    ],
    "Ek Prim": true,
    "Fazla Mesai": false,
    "Tatil G\u00fcnleri": [
        "\u00c7ar\u015famba",
        "Pazar"
    ]
}

Evet. Şimdi artık JSON’ı görmek istediğimiz şekilde daha okunabilir olarak görüyoruz. Ancak Türkçe karakterlerle ilgili bir sorunumuz olduğunu farketmişsinizdir. Bunu çözmek için de UTF-8 formatında encode-decode edecek bir işleme ihtiyacımız var;

personel={
  'Adı Soyadı': 'Mert Demir', # str formatından string formatına
  'Deneyim': 8, # int formatından Number formatına
  'Programlama Dilleri':[
    {'Arayüz Dili': 'VueJS', 'Arayüz Deneyimi': 2},
    {'Sunucu Dili': 'Python', 'Sunucu Deneyimi': 8}
  ], # Liste formatından Dizi formatına
  'Ek Prim': True, # Boolean formatından Boolean formatına
  'Fazla Mesai':False, # Boolean formatından Boolean formatına
  'Tatil Günleri': ('Çarşamba','Pazar') # Demet formatından Dizi formatına
}

jsonVerisi=json.dumps(personel, indent=4, ensure_ascii=False).encode('utf8')

print(jsonVerisi.decode())

Çıktı:

{
    "Adı Soyadı": "Mert Demir",
    "Deneyim": 8,
    "Programlama Dilleri": [
        {
            "Arayüz Dili": "VueJS",
            "Arayüz Deneyimi": 2
        },
        {
            "Sunucu Dili": "Python",
            "Sunucu Deneyimi": 8
        }
    ],
    "Ek Prim": true,
    "Fazla Mesai": false,
    "Tatil Günleri": [
        "Çarşamba",
        "Pazar"
    ]
}

 

Eğer çok sayıda veri ile çalışıyorsanız ve anahtar isimlerine göre sıralayarak değerlerin daha kolay bulunabilir olmasını istiyorsanız ya da farklı sıralama ile gelmiş bir çok veriyi anahtar isimlerine göre bir düzene sokmak isterseniz dump() metodu içinde sort_keys=True parametresini kullanabilirsiniz.

personel={
  'Adı Soyadı': 'Mert Demir', # str formatından string formatına
  'Deneyim': 8, # int formatından Number formatına
  'Programlama Dilleri':[
    {'Arayüz Dili': 'VueJS', 'Arayüz Deneyimi': 2},
    {'Sunucu Dili': 'Python', 'Sunucu Deneyimi': 8}
  ], # Liste formatından Dizi formatına
  'Ek Prim': True, # Boolean formatından Boolean formatına
  'Fazla Mesai':False, # Boolean formatından Boolean formatına
  'Tatil Günleri': ('Çarşamba','Pazar') # Demet formatından Dizi formatına
}

jsonVerisi=json.dumps(personel, indent=4, sort_keys=True, ensure_ascii=False).encode('utf8')

print(jsonVerisi.decode())

Çıktı:

{
    "Adı Soyadı": "Mert Demir",
    "Deneyim": 8,
    "Ek Prim": true,
    "Fazla Mesai": false,
    "Programlama Dilleri": [
        {
            "Arayüz Deneyimi": 2,
            "Arayüz Dili": "VueJS"
        },
        {
            "Sunucu Deneyimi": 8,
            "Sunucu Dili": "Python"
        }
    ],
    "Tatil Günleri": [
        "Çarşamba",
        "Pazar"
    ]
}

 

Burada yer alan örneklere şu adreste ulaşabilirsiniz;

https://repl.it/@ObenSEVEN/json

 

Detaylı bilgi için; Python JSON Dokümanı

 

Not: XML ve JSON, günümüzde veri transferi konusunda en çok kullanılan iki formattır. Bu iki format arasındaki benzerlikleri aydınlatmak için “XML Dosyaları ile Çalışmak” konusunda kullandığımız XML dosyasını;

<?xml version="1.0" encoding="UTF-8"?>
<urunler kategori="Kırtasiye">
  <urun alt-kategori="Kalemler">
    <urun_adi>Rotring Tikky Versatil Kalem 0,9</urun_adi>
    <fiyat>27,99 TL.</fiyat>
    <aciklama>
      Yazım ve çizim yapmak için son derece uygun bir model olan Rotring Tikky 1904507 Mekanik Kurşun Kalem 0.9 mm, başta öğrenciler olmak üzere sık kalem kullanımı yapan kişilere hitap ediyor. 
    </aciklama>
  </urun>
  <urun alt-kategori="Silgiler">
    <urun_adi>Faber-Castell 3'lü Büyük Beyaz Silgi</urun_adi>
    <fiyat>12,50 TL.</fiyat>
    <aciklama>
      PVC içermeyen, kalıntı bırakmayan, sınavlarda kullanıma uygun silgi seti.
    </aciklama>
  </urun>
  <urun alt-kategori="Silgiler">
    <urun_adi>Castellini Beyaz Tahta Silgisi</urun_adi>
    <fiyat>35,90 TL.</fiyat>
    <aciklama>
      Sınıflarda beyaz tahtalarda kullanıma uygun, kendinden manyetik yapışkanlı silgi.
    </aciklama>
  </urun>
  <urun alt-kategori="Defterler">
    <urun_adi>Gıpta Prizma Bloknot Kareli 100 Yaprak A4</urun_adi>
    <fiyat>19,90 TL.</fiyat>
    <aciklama>
      Gıpta Prizma Bloknot 
        * 60 Gr Kağıt 
        * Ofset Baskılı 
        * Spiralli Bloknot 
        * A4 - A5 boyutunda 100 yaprak kareli defter.
    </aciklama>
  </urun>
</urunler>

JSON formatında yazdığımızda;

{"urunler":{
    "kategori":"Kırtasiye",
    "urun":[
        {
            "alt-kategori":"Kalemler",
            "urun_adi":"Rotring Tikky Versatil Kalem 0,9",
            "fiyat":"27,99 TL.",
            "aciklama":"Yazım ve çizim yapmak için son derece uygun bir model olan Rotring Tikky 1904507 Mekanik Kurşun Kalem 0.9 mm, başta öğrenciler olmak üzere sık kalem kullanımı yapan kişilere hitap ediyor."
        },
        {
            "alt-kategori":"Silgiler",
            "urun_adi":"Faber-Castell 3'lü Büyük Beyaz Silgi",
            "fiyat":"12,50 TL.",
            "aciklama":"PVC içermeyen, kalıntı bırakmayan, sınavlarda kullanıma uygun silgi seti."
        },
        {
            "alt-kategori":"Silgiler",
            "urun_adi":"Castellini Beyaz Tahta Silgisi",
            "fiyat":{
                "guncelleme_tarihi":"01.01.2021",
                "deger":"45,90 TL."
            },
            "aciklama":"Sınıflarda beyaz tahtalarda kullanıma, kendinden manyetik yapışkanlı silgi."
        },
        {
            "alt-kategori":"Defterler",
            "urun_adi":"Gıpta Prizma Bloknot Kareli 100 Yaprak A4",
            "fiyat":"19,90 TL.",
            "aciklama":"Gıpta Prizma Bloknot \n * 60 Gr Kağıt \n * Ofset Baskılı \n * Spiralli Bloknot \n * A4 - A5 boyutunda 100 yaprak kareli defter."
        }
    ]
  }
}

olarak karşımıza çıkıyor.

Ancak biçimlendirme konusunda özgür olduğumuza göre JSON ile çalışırken XML’de parametre olan kategorileri direkt kullanarak şu şekilde bir yapıda oluşturabiliriz;

{
    "Kırtasiye":
        {
            "Kalemler":
                {
                    "urun_adi": "Rotring Tikky Versatil Kalem 0,9",
                    "fiyat": 27.99,
                    "aciklama": "Yazım ve çizim yapmak için son derece uygun bir model olan   Rotring Tikky 1904507 Mekanik Kurşun Kalem 0.9 mm, başta öğrenciler olmak   üzere sık kalem kullanımı yapan kişilere hitap ediyor."
                },
      		"Silgiler":        
                [
          			{
              	  		"urun_adi": "Faber-Castell 3'lü Büyük Beyaz Silgi",
                      	"fiyat": 12.50,
                      	"aciklama": "PVC içermeyen, kalıntı bırakmayan, sınavlarda kullanıma uygun silgi seti."
                  	},
          			{
  						"urun_adi": "Castellini Beyaz Tahta Silgisi",
      					"fiyat": 45.90,
          				"aciklama": "Sınıflarda beyaz tahtalarda kullanıma uygun, kendinden manyetik yapışkanlı silgi."
                  	}
        		],
      		"Defterler":
        		{
              		"urun_adi": "Gıpta Prizma Bloknot Kareli 100 Yaprak A4",
              		"fiyat": 19.90,
              		"aciklama": "Gıpta Prizma Bloknot * 60 Gr Kağıt * Ofset Baskılı * Spiralli  Bloknot * A4 - A5 boyutunda 100 yaprak kareli defter."
              	}
        }
}

Tamamen dosyaları oluştururken veriyi nasıl kuguladığınıza bağlı. Tabii bu veriyi sağlayan siz iseniz. Gerçek hayat uygulamalarında çoğu zaman API tarafından sağlanan veri formatına uyum sağlamak zorunda kalırsınız ve maalesef bir çoğu da karmaşık ve iyi yapılandırılmamış olabilirler. Sonuçta, “Her yiğidin yoğurt yiyişi farklıdır!”