2.1 json
modulu
JSON (JavaScript Object Notation) — bu, məlumatların mübadiləsi üçün yüngül formatdır, insan tərəfindən asan oxunur və yazılır, həmçinin kompüter tərəfindən asan analiz edilir və yaradılır. JSON tez-tez server ilə veb-tətbiq arasında məlumatların ötürülməsi, eləcə də konfiqurasiyalar və sazlamaların saxlanması üçün istifadə olunur.
Python-da json
modulu serializasiya (Python obyektlərini JSON sətirlərinə çevirmə) və deserializasiya (JSON sətirlərini Python obyektlərinə çevirmə) üçün funksiyalar təqdim edir. Bu modul Python-un standart kitabxanasına daxil edilib və JSON məlumatları ilə işləmək üçün aktiv istifadə olunur.
json
modulunun əsas funksiyaları çox açıq şəkildə pickle
modulunun funksiyalarını xatırladır və oxşar işləyir. Nə istəyirsiniz ki — standart!
- Sətirlərlə iş:
-
json.dumps(obj)
— Python obyektini JSON sətirinə çevirir. -
json.loads(s)
— JSON sətirini Python obyektinə çevirir.
-
- Fayllarla iş:
-
json.dump(obj, file)
— Python obyektini serializasiya edir və onu mətni fayla yazır. -
json.load(file)
— JSON formatında məlumat saxlayan mətni fayldan Python obyektini deserializasiya edir.
-
Bu funksiyaların işini daha yaxşı yadda saxlamaq üçün gəlin bir neçə nümunəyə baxaq.
2.2 JSON mətninə serializasiya
Python obyektlərinin JSON mətnlərinə serializasiyası
Obyekti serializasiya etmək üçün sadəcə onu json.dumps()
funksiyasına ötürmək kifayətdir.
import json
# Serializasiya üçün obyekt nümunəsi
data = {
"name": "Alice",
"age": 30,
"is_student": False,
"courses": ["Math", "Science"],
"address": {
"city": "New York",
"zip_code": "10001"
}
}
# Python obyektini JSON mətninə çevirmək
json_string = json.dumps(data, indent=4)
print("Serializasiya olunmuş məlumatlar (JSON):", json_string)
JSON mətnlərinin Python obyektlərinə deserializasiyası
Obyekti mətn şəklində geri almaq üçün JSON mətnini, hansı ki obyekti təsvir edir, sadəcə json.loads()
metoduna ötürmək lazımdır.
import json
# Deserializasiya üçün JSON mətn nümunəsi
json_string = ''' { "name": "Alice", "age": 30, "is_student": false, "courses": ["Math", "Science"], "address": { "city": "New York", "zip_code": "10001" } } '''
# JSON mətnini Python obyektinə çevirmək
data = json.loads(json_string)
print("Deserializasiya olunmuş məlumatlar (Python):", data)
2.3 Fayla serialize etmək
Python obyektlərini JSON formatında fayla yazmaq
Obyekti fayla yazmaq üçün json.dump()
metodunu çağırmaq lazım olur. Fayllarla işləyərkən mümkün səhvləri düzgün idarə etmək üçün istisna emalından istifadə etmək vacibdir. Budur bir nümunə:
import json
# Serialize üçün obyekt nümunəsi
data = {
"name": "Bob",
"age": 25,
"is_student": True,
"courses": ["History", "Literature"],
"address": {
"city": "Los Angeles",
"zip_code": "90001"
}
}
# İstisna emalı ilə Python obyektini JSON faylına yazmaq
try:
with open('data.json', 'w') as file:
json.dump(data, file, indent=4)
print("Məlumatlar fayla uğurla yazıldı.")
except IOError:
print("Fayla yazarkən səhv aşkarlandı.")
except json.JSONEncodeError:
print("JSON kodlaşdırmasında səhv aşkarlandı.")
JSON formatında fayldan Python obyektlərini oxumaq
Oxumaq da çox sadədir — faylı json.load()
metoduna ötürmək kifayətdir. Burada da istisna emalından istifadə etmək vacibdir:
import json
# İstisna emalı ilə JSON faylından Python obyektini oxumaq
try:
with open('data.json', 'r') as file:
data = json.load(file)
print("Fayldan deserialized edilmiş məlumatlar (Python):", data)
except IOError:
print("Faylı oxuyarkən səhv aşkarlandı.")
except json.JSONDecodeError:
print("JSON dekodlaşdırmasında səhv aşkarlandı.")
2.4 Funksiyaların əlavə parametrləri
Sərializasiya ilə məşğul olan funksiyaya əlavə parametrlər ötürmək olar ki, bu da JSON-u daha gözəl edər:
-
skipkeys
: ƏgərTrue
olarsa, sətirlər, rəqəmlər və yaNone
olmayan açarları keçir. -
ensure_ascii
: ƏgərTrue
olarsa, bütün ASCII olmayan simvollar Unicode escape sequences ilə əvəz olunacaq. -
indent
: Əgər rəqəm göstərilsə, daha oxunaqlı etmək üçün boşluqlar əlavə ediləcək. -
sort_keys
: ƏgərTrue
olarsa, JSON açarları əlifba sırasına görə sıralanacaq.
json.dumps()
parametrlərindən istifadə nümunəsi:
import json
data = {"c": 3, "b": 2, "a": 1}
# Açarların sıralanması və boşluqlarla sərializasiya
json_string = json.dumps(data, indent=4, sort_keys=True)
print(json_string)
2.5 Xüsusi dekoderlər və kodlayanlar
json
modulu obyektlərin serialization-u və deserialization-u üçün xüsusi funksiyalar istifadə etməyə imkan verir.
Xüsusi kodlayıcı nümunəsi
İlk növbədə, içərisində obyektin tipini yoxlayan və əgər obyektin tipi == datetime, onda obyekti ISO formatında string olaraq qaytarır
xüsusi encoder class yaradırıq.
import json
from datetime import datetime
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime): return obj.isoformat()
return super().default(obj)
data = {
"name": "Alice",
"timestamp": datetime.now()
}
# Xüsusi kodlayıcı ilə serialization
json_string = json.dumps(data, cls=CustomEncoder, indent=4)
print(json_string)
Xüsusi dekoder nümunəsi
Əks əməliyyat üçün də string-i tarixə çevirən bir funksiya lazımdır. Məsələn, sadəcə sahənin adını yoxlamaq olar və əgər adı timestamp-dırsa, string-i datetime obyektinə çevirə bilərik
:
import json
from datetime import datetime
def custom_decoder(dct):
if 'timestamp' in dct: dct['timestamp'] = datetime.fromisoformat(dct['timestamp'])
return dct
json_string = '''
{
"name": "Alice",
"timestamp": "2023-05-15T14:30:00"
}
'''
# Xüsusi dekoder ilə deserialization
data = json.loads(json_string, object_hook=custom_decoder)
print(data)
GO TO FULL VERSION