JSON
Ayar (config) ya da veriyi hem insan hem makine tarafından okunabilir bir formatta paylaşmak istersek JSON kullanabiliriz. JSON bir bakıma Python sözlük (dictionary) kavramının dosyaya çevrilmiş hali. Python ile sözlük yaratmak hatırlarsak,
mydict = {}
mydict['anahtar1'] = 'deger1'
print (mydict)
{'anahtar1': 'deger1'}
ile yapılabiliyor. Bu çetrefil sözlükleri metin dosyasından başlayarak yaratmak için JSON kullanırız. 90'li yıllarda XML kullanılan yerlerde artık hep JSON görüyoruz.
JSON içindeki yapı hiyerarşik olabilir, dosyada direk anahtar bazlı tekil değerler, ya da listeler, listeler içinde daha fazla listeler olabilir. Altta mesela bir coğrafi veri işleminde kullanılabilecek bir örnek,
print (open("test.json").read())
{
"center": [41, 29],
"points": {
"city 1": [41.1, 29.2],
"city 2": [41.4, 29.8]
},
"plist": [[3,3],[5,5],[7,7]],
"url1": "https://www.cnn.com",
"maps": [
"file1.gpx",
"file2.gpx",
"file3.gpx",
"file4.gpx"
]
}
Harita merkezi center
, nokta listeleri points
ve onun altında yine anahtar
bazlı city
, city 2
diye gidiyor. Erişmek için,
import json
jf = json.loads(open("test.json").read())
print (jf.keys())
dict_keys(['center', 'points', 'plist', 'url1', 'maps'])
Sözlük demiştik; işte en üst seviyede hakikaten dict_keys
ibaresi
var. Şimdi points
noktalarından city 1
erişimi yapalım,
print (jf['points']['city 1'])
[41.1, 29.2]
Bu hiyerarşik yapı istediğimiz kadar derine gidebilir. İşin güzel tarafı tiplemenin otomatik algılanıp doğru Python objesi yaratılması, mesela
print (type(jf['points']['city 1']))
<class 'list'>
Yani köşeli parantez görünce json
paketi bunun liste objesi olduğunu
anladı. Bu özelliği farklı yerlerde de kullanabiliriz, bazen bir veri
dosyasında bir metin bazlı bir liste depolanmış olabilir,
str_liste1 = '["1","2","3"]'
Bu veri belki bir CSV'den Pandas objesi içinde geldi, ya da başka bir
yerden, pür metin halde.. Bu metni json
'a çevirttirebiliriz, ki bu
yaklaşım eval
çağrısından çok daha hızlı ve güvenli işler,
liste1 = json.loads(str_liste1)
print (liste1)
print (type(liste1))
['1', '2', '3']
<class 'list'>
Not: Programcılar bu paketin ismini 'jey-sin' olarak telafuz eder; erkek ismi Jason ile ses benzerliği var, yazanlar herhalde bunu bilerek ismi seçtiler.
Yukarı