Python ilə JSON

JSON nədir?

JSON, JavaScript Obyekt Notasiyası deməkdir. JavaScript sintaksisinə əsaslanır. Sintaktik olaraq JSON formatı JavaScript obyektlərinin yaradılması koduna bənzəyir. JSON Javascript-ə əsaslansa da, JSON Javascript-dən, bəziləri isə JavaScript-dən fərqlidir yox JSON. Bu yazıda biz Python ilə JSON-dan necə istifadə edəcəyimizi öyrənəcəyik.

JSON tamamilə dildən müstəqil mətn formatıdır, eyni zamanda C, C++, C#, Java, JavaScript, Perl, Python, və bir çox başqaları. Buna görə JSON ideal məlumat mübadiləsi dili hesab olunur.

Strukturlaşdırılmış məlumatları şəbəkə bağlantısı üzərindən seriallaşdırmaq və ötürmək üçün JSON tez-tez istifadə olunur. XML eyni məqsəd üçün istifadə olunsa da, biz JSON-dan ilk növbədə server və server arasında məlumat ötürmək üçün istifadə edirik veb tətbiqi. JSON yüngül olduğu üçün XML-dən üstündür. JSON haqqında daha ətraflı məlumatı rəsmi saytında öyrənə bilərsiniz JSON veb saytı.

JSON obyekti:

JSON obyekti JavaScript obyektlərinə və Python lüğətlərinə bənzəyir. JavaScript obyektləri və Python lüğətləri kimi JSON obyekti də əyri mötərizələrlə əhatə olunmuş sıralanmamış ad və dəyər cütlüyüdür. Ad-dəyər cütü iki dırnaq içərisində ad, ardınca iki nöqtə və ardınca dəyər ilə təmsil olunur.

{
"Name":"John"
}

Obyektdə çoxlu ad-dəyər cütləri və ad-dəyər cütləri də ola bilər. Ad-dəyər vergüllə ayrılır.

{
  "id": "0001",
  "type": "donut",
  "name": "Cake",
  "ppu": 0.55,
  "batters":
    {
      "batter":
        [
          { "id": "1001", "type": "Regular" },
          { "id": "1002", "type": "Chocolate" },
          { "id": "1003", "type": "Blueberry" },
          { "id": "1004", "type": "Devil's Food" }
        ]
    },
  "topping":
    [
      { "id": "5001", "type": "None" },
      { "id": "5002", "type": "Glazed" },
      { "id": "5005", "type": "Sugar" },
      { "id": "5007", "type": "Powdered Sugar" },
      { "id": "5006", "type": "Chocolate with Sprinkles" },
      { "id": "5003", "type": "Chocolate" },
      { "id": "5004", "type": "Maple" }
    ]
}

JSON da dəstəkləyir məlumat növləri rəqəmlər, sətirlər, siyahılar və obyektlər kimi.

Python ilə JSON:

Bəzi kod nümunələri ilə Python-da JSON məlumatlarının necə aparılacağını anlamağa başlayaq. Python, JSON məlumatları ilə işləmək üçün istifadə edə biləcəyimiz daxili json paketi ilə gəlir. Bu paketdən istifadə etmək üçün Python skriptimizə json-u idxal etməliyik.

import json

Serializasiya və seriyadan çıxarma:

JSON məlumatlarının yaddaşda saxlanması və ya şəbəkədə paylaşılması üçün bir sıra baytlara çevrilməsi prosesi Kodlaşdırma adlanır. Serializasiya JSON məlumatlarının kodlaşdırılması prosesidir.

Serializasiyanın əks prosesi Deserializasiyadır. Verilənlərin dekodlanması prosesi Deserialization adlanır.

Sadə dillə desək, serializasiya və Deserialization məlumatların yaddaşa yazılması və oxunması deməkdir. Kodlaşdırma məlumatları yazmaq üçün, deşifrə isə məlumatları oxumaq üçündür.

JSON məlumatlarının seriyalaşdırılması:

Python-un daxili json paketi Python obyektlərini JSON-a çevirmək üçün dump() və dumps() metodunu təmin edir. Bu iki üsul arasındakı fərqə baxaq:

dump() zibillər()
dump() Python obyektlərini JSON obyektlərinə çevirir və fayla yazır. Python obyektini JSON sətirinə çevirmək üçün dumps() istifadə olunur
Verilənlərin saxlanacağı çıxış faylı arqument kimi ötürülməlidir Fayl adı tələb olunmur
Dumplardan daha sürətli() Dumpdan daha yavaş()

Aşağıdakı cədvəl Python obyektlərinin ekvivalent JSON obyektlərinə necə çevrildiyini izah edir.

Python obyekti Ekvivalent JSON obyekti
Dikt Obyekt
siyahı Geyim
Tuple Geyim
str Sim
int Nömrə
axıtma Nömrə
Doğru doğru
Saxta saxta
heç kim null

dump() nümunəsi:

Python obyektini JSON obyektinə çevirmək və dump() metodundan istifadə edərək faylda saxlamaq üçün nümunəyə baxaq. Bu bizim python məlumatlarımızdır

python_data=
    {
      "batter":
        [
          { "id": "1001", "type": "Regular" },
          { "id": "1002", "type": "Chocolate" },
          { "id": "1003", "type": "Blueberry" },
          { "id": "1004", "type": "Devil's Food" }
        ]
    }

Və Python kodu:

with open('Data_file.json','w') as filename:
    json.dump(python_data,filename)

dump() iki arqument alır:

  • python_data
  • fayl adı-Data_file.json, JSON obyektinin saxlanacağı çıxış faylıdır.

dumps() nümunəsi:

dumps() metodu Python obyektini JSON sətirinə çevirir.

json_string=json.dumps(python_data)

Burada biz tələb olunmayan dump() funksiyasında etdiyimiz kimi digər arqument fayl adını ötürmürük.

dump() və dump() üçün açar söz arqumentləri:

abzas:

JSON-u oxumaq asan olsa da, düzgün formatlaşdırıldıqda onu oxumaq daha da asanlaşır. Siz daxili strukturlar üçün girinti dəyişdirmək üçün indent adlı əlavə açar söz arqumentindən istifadə edə bilərsiniz. Aşağıdakı kodu yerinə yetirin və abzasdan istifadə edərək formatdakı fərqə diqqət yetirin.

print(json.dumps(python_data))
print(json.dumps(python_data,indent=4))

ayırıcı:

Formatlaşdırmanı dəyişdirmək üçün istifadə edə biləcəyimiz başqa bir açar söz arqumenti var, ayırıcılar. Ayırıcı (element_separator, key_separator) dəstidir. Varsayılan dəyər (', ',': '). Ən yığcam JSON-u əldə etmək üçün boşluqları aradan qaldıran (',',':') istifadə edin.

print(json.dumps(python_data))
print(json.dumps(python_data,separators=(',',':')))

Baxın docs açar söz arqumentlərinin əlavə siyahısı üçün.

JSON məlumatlarının seriyadan çıxarılması:

Deserializasiya JSON obyektlərini müvafiq Python obyektlərinə çevirir. Seriyadan çıxarmaq üçün load() və loads() funksiyalarından istifadə edə bilərik.

load() öz məlumatını fayldan, loads() isə sətir obyektindən alır.

Aşağıda masaları JSON obyektlərinin müvafiq Python obyektlərinə necə çevrildiyini izah edir:

JSON obyekti Python obyekti
obyekt dict
array siyahı
sim str
null heç kim
sayı (int) int
nömrə (real) axıtma
doğru Doğru
saxta Saxta

Bu cədvəl seriallaşdırmada gördüyümüz cədvəlin tam əksi deyil. Bunun səbəbi, biz bir obyekti kodlayanda, deşifrədən sonra eyni obyekti geri ala bilməyə bilərik.

Aşağıdakı nümunəni yoxlayın, biz bir dəftəri kodlayırıq. JSON obyektinin silsilə ekvivalenti massivdir. Massivin dekodlanması siyahı verir. Beləliklə, siyahının kodlaşdırılması və dekodlanması bir siyahı ilə nəticələnir.

import json

input_data=('a','b',1,2,3)
encoded_data=json.dumps(input_data)
decoded_data=json.loads(encoded_data)
print(input_data==decoded_data)
print(type(input_data))
print(type(decoded_data))
print(input_data==tuple(decoded_data))

load() nümunəsi:

load() metodu JSON obyektini Python obyektinə çevirir və onun girişini fayldan alır. Məlumatları seriallaşdırarkən Data_file.json yaratdığımızı unutmayın. Gəlin burada eyni fayldan istifadə edək.

import json

with open('Data_file.json','r') as filename:
    data=json.load(filename)

print(data)

Əgər etməsəniz verilənlərin növü siz yükləyirsiniz, sonra yadda saxlayın ki, nəticədə əldə edilən məlumatın növü çevrilmə cədvəlində mövcud olan hər hansı bir şey ola bilər.

loads() nümunəsi:

loads() öz girişini fayl əvəzinə sətirdən alır.

import json

json_data="""
{
      "batter":
        [
          { "id": "1001", "type": "Regular" },
          { "id": "1002", "type": "Chocolate" },
          { "id": "1003", "type": "Blueberry" },
          { "id": "1004", "type": "Devil's Food" }
        ]
    }
"""

print(json.loads(json_data))

Real vaxt nümunəsi:

Təcrübə etmək üçün istifadə edək JSONPlaceholdernümunə JSON məlumatını təmin edən. Biz JSONPlaceholder xidmətinə API sorğusu etməklə məlumatları əldə edə bilərik. Python API zəngləri etmək üçün istifadə edə biləcəyimiz "istəklər" adlı daxili paket təqdim edir.

Seçdiyiniz adla və istədiyiniz yerdə Python faylı yaradın və sonra aşağıdakı paketləri idxal edin.

import json
import requests

/todos son nöqtəsi üçün JSONPlaceholder xidmətinə API sorğusu göndərməliyik. API çağırışı uğurlu olduqda, status kodu olaraq 200 alacağıq.

response = requests.get("https://jsonplaceholder.typicode.com/todos")
print(response.status_code)

Cavab obyektinin mətn atributunu silmək üçün json.loads və ya json() metodundan istifadə edə bilərik. Yuxarıda gördüyümüz kimi yüklər json funksiyasıdır və ondan təkcə sətir məlumatlarını təhlil etmək üçün deyil, həm də sorğu kontekstində istifadə etmək olar.

response = requests.get("https://jsonplaceholder.typicode.com/todos")
print(json.loads(response.text))

.json sorğular.modellər.Response sinifinin metodudur. Sorğunun cavabından json məlumatlarını qaytarır.

response = requests.get("https://jsonplaceholder.typicode.com/todos")
print(response.json())

json.loads və .json çıxışı eyni olsa da.

response = requests.get("https://jsonplaceholder.typicode.com/todos")
print(response.json()==json.loads(response.text))

Əgər kodu hər dəfə dəyişdirdiyiniz zaman Python faylınız və terminalınız arasında keçid etməkdə çətinlik çəkirsinizsə, skriptinizi interaktiv rejimdə işə salmaq rahatdır. Skripti işə saldığımız zaman -i istifadə edərək interaktiv rejimdə işləyə bilərsiniz. Üstünlüyü təkcə skripti işlətmir, həm də edə bilərsiniz bütün məlumatlara daxil olmaq terminalın özündə olan skriptdən.

PS C:\Users\Gopi\Desktop\backup\myPython\freelancer> python -i code1.py
>>> json.loads(response.text)==response.json()
True
>>> response.status_code
200

Respondent.json() metodu siyahı qaytarır. Qaytarılan elementlə bütün siyahı əməliyyatlarını edə bilərsiniz.

response = requests.get("https://jsonplaceholder.typicode.com/todos")
todos=response.json()
print(type(todos))
print(todos[10])

Todo elementinin necə göründüyü barədə fikir əldə etmək üçün bəzi təsadüfi elementləri çap edirik. Siz həmçinin brauzerdə son nöqtəyə baş çəkərək elementə baxa bilərsiniz.

{
  'userId': 1, 
  'id': 11, 
  'title': 'vero rerum temporibus dolor', 
  'completed': True
}

Python ilə JSONPin

Maksimum tapşırıqları tamamlayan istifadəçiləri tapın:

Məlumatlara nəzər salsanız, tapa bilərsiniz ki, onların hər birinin unikal istifadəçi identifikatoru olan bir neçə istifadəçi var və hər bir görüləcək iş elementinin "tamamlandı" adlı xüsusiyyəti var. Hansı istifadəçilərin maksimum tapşırıqları yerinə yetirdiyini öyrənək.

import requests

todos_completed_by_each_user={}

response = requests.get("https://jsonplaceholder.typicode.com/todos")
todos = response.json()

for todo in todos:
    if todo['completed']:
        try:
            todos_completed_by_each_user[todo['userId']]+=1
        except KeyError:
            todos_completed_by_each_user[todo['userId']]=1

#sorting the dictionary based on maximum completed todos in

tərs sifariş

max_todos_by_user = sorted(todos_completed_by_each_user.items(),
                   key=lambda x: x[1], reverse=True)

#Gets the

maksimum sayı

 of todos completed
max_todos = max_todos_by_user[0][1]

users=[]

#Gets the list of users who have completed the maximum todos
for user,no_of_todos in max_todos_by_user:
    if no_of_todos<max_todos:
        continue
    users.append(str(user))

max_users = " and ".join(users)
print(max_users)

İndi biz tamamlayan istifadəçilərin siyahısını əldə etdik maksimum sayı todos. Çıxışı gözəl bir şəkildə çap etməyə çalışaq.

s='s' if len(users)>1 else ""
print(f'User{s} {max_users} completed {max_todos} TODOs')

Çıxış belə olacaq:

Users 5 and 10 and 8 completed 12 TODOs

İndi gəlin “completed_todos.json” adlı json faylını yaradaq, bu faylı tamamlayan istifadəçilər üçün tamamlanmış tapşırıqları ehtiva edir. maksimum sayı todos.

def filtered_todos(todo):
    has_max_count = str(todo["userId"]) in users
    is_complete = todo["completed"]
    return is_complete and has_max_count

# Write filtered TODOs to file.
with open("filtered_todos.json", "w") as data_file:
    filtered_todos = list(filter(filtered_todos, todos))
    json.dump(filtered_todos, data_file, indent=2)

Əgər filter() metodundan xəbəriniz yoxdursa, filter() metodu ardıcıllığın hər bir elementinin doğru və ya yalan olduğunu təsdiq edən funksiyanın köməyi ilə ardıcıllığı süzür.

Burada filter() metodu filtered_todos() adlı funksiyadan istifadə edir, o, istifadəçi id-nin maksimum tapşırıqları tamamlamış istifadəçilər siyahısında olub-olmadığını yoxlayır və həmçinin verilmiş istifadəçi üçün todo tamamlanıb- tamamlanmadığını yoxlayır. Əgər hər iki şərt doğrudursa, biz dump() metodundan istifadə edərək çıxış faylımıza həmin işi yazırıq.

“completed_todos.json” çıxış faylı yalnız maksimum tapşırıqları yerinə yetirmiş istifadəçilərin tamamlanmış işlər siyahısını ehtiva edir.

Xüsusi Python obyektlərinin seriyalaşdırılması və seriyadan çıxarılması:

Öz fərdi python obyektimizi yaradaq.

class EmployeeDetails:
    def __init__(self,firstname,lastname,age):
        self.firstname = firstname
        self.lastname = lastname
        self.age=age

    def get_name(self):
        return self.firstname+' '+self.lastname

emp=EmployeeDetails('John','Terry',29)
emp_name=emp.get_name()

Biz EmployeeDetails adlı sinif və işçinin adını qaytaran metod yaradırıq. Bunun üçün bir obyekt yaradaq.

İndi emp_name dəyişənini seriallaşdırmağa çalışın və nə baş verdiyinə baxın.

PS C:\Users\Gopi\Desktop\backup\myPython\freelancer> python -i sample.py
John Terry
>>> json.dumps(emp_name)
'"John Terry"'

Sim tipli emp_name serializasiya etməyə çalışarkən heç bir problemlə üzləşmirik. Yaratdığımız xüsusi python obyekt emp-ni seriallaşdırmağa çalışdığımız zaman nə baş verdiyinə baxın.

>>> json.dumps(emp)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\Gopi\AppData\Local\Programs\Python\Python36-32\lib\json\__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "C:\Users\Gopi\AppData\Local\Programs\Python\Python36-32\lib\json\encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "C:\Users\Gopi\AppData\Local\Programs\Python\Python36-32\lib\json\encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "C:\Users\Gopi\AppData\Local\Programs\Python\Python36-32\lib\json\encoder.py", line 180, in default
    o.__class__.__name__)
TypeError: Object of type 'EmployeeDetails' is not JSON serializable

Biz “EmployeeDetails” xətası alırıq JSON serializasiya edilə bilməz. Python-un daxili məlumat növlərinin əksəriyyətini kodlaya bilsək də, json modulu xüsusi python obyektlərinin necə seriallaşdırılmasını bilmir.

Məlumat strukturlarının sadələşdirilməsi:

Fərdi obyekti birbaşa kodlaşdırmağa çalışmaq əvəzinə, edə biləcəyimiz xüsusi obyekti json modulunun başa düşdüyü başqa təqdimata çevirmək və sonra onu JSON-a çevirməkdir.

Bir nümunənin köməyi ilə bunun necə işlədiyini anlayaq. Kompleks ədədləri təmsil etmək üçün Python daxili təmin edir məlumat növü "kompleks". Kompleks ədəd a+bj formatında ifadə edilir, burada 'a' həqiqi hissə, 'b' isə xəyali hissədir.

>>> import json
>>> z=2+5j
>>> type(z)
<class 'complex'>
>>> json.dumps(z)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\Gopi\AppData\Local\Programs\Python\Python36-32\lib\json\__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "C:\Users\Gopi\AppData\Local\Programs\Python\Python36-32\lib\json\encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "C:\Users\Gopi\AppData\Local\Programs\Python\Python36-32\lib\json\encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "C:\Users\Gopi\AppData\Local\Programs\Python\Python36-32\lib\json\encoder.py", line 180, in default
    o.__class__.__name__)
TypeError: Object of type 'complex' is not JSON serializable

Kompleks nömrələr JSON seriyalı olmadığı üçün gəlin kompleks nömrəni json modulunun başa düşdüyü formata çevirməyə çalışaq.

Mürəkkəb bir ədəd yaratmaq üçün bizə lazım olan yalnız real hissə və xəyali hissədir.

>>> z.real
2.0
>>> z.imag
5.0

Həqiqi və xəyali hissəni kompleks konstruktora ötürdükdə kompleks ədəd alacağıq.

>>> complex(2,5)==z
True

Bir adəti necə pozacağını başa düşmək vacibdir məlumat növü onu seriallaşdırmaq və sıradan çıxarmaq üçün onun əsas komponentlərinə.

Fərdi məlumat növlərinin kodlaşdırılması:

İndi kompleks ədəd yaratmaq üçün bütün vacib komponentlərə sahibik. Kompleks ədədi JSON-a çevirmək üçün edə biləcəyimiz şey öz kodlaşdırma funksiyamızı yaratmaq və onu dump() metoduna ötürməkdir.

Aşağıda mürəkkəb ədədləri kodlaşdırmaq üçün istifadə edə biləcəyimiz üsul verilmişdir. Mürəkkəb ədədlərdən başqa hər hansı digər fərdi məlumat növlərini funksiyaya giriş kimi ötürsək, o, tip xətası yaradacaq.

def encode_complex_numbers(z):
    if isinstance(z,complex):
        return (z.real,z.imag)
    else:
        type_name=z.__class__.__name__
        raise TypeError(f'Object of type {type_name} is not JSON serializable')

JSON seriyası olmayan fərdi məlumat növünü çevirməyə çalışdığımız zaman kodlaşdırma funksiyamız çağırılacaq.

>>> json.dumps(2+5j,default=encode_complex_numbers)
'[2.0, 5.0]'
>>> json.dumps(emp,default=encode_complex_numbers)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\Gopi\AppData\Local\Programs\Python\Python36-32\lib\json\__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "C:\Users\Gopi\AppData\Local\Programs\Python\Python36-32\lib\json\encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "C:\Users\Gopi\AppData\Local\Programs\Python\Python36-32\lib\json\encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "sample.py", line 18, in encode_complex_numbers
    raise TypeError(f'Object of type {type_name} is not JSON serializable')
TypeError: Object of type EmployeeDetails is not JSON serializable

Diqqət yetirin ki, indi biz kompleks ədədləri 'encode_complex_numbers' funksiyamızdan istifadə edərək seriallaşdıra bilərik. İstənilən digər fərdi məlumat növləri üçün biz növ xətası alacağıq. Xətanın kodumuzdan çap edildiyini necə bildiyimizlə bağlı sual ala bilərsiniz. Vurğulanmış xəttə diqqət yetirin, nümunə mənim kodlaşdırma funksiyamın mövcud olduğu fayl adıdır, həmin yerdə fayl adınızı görəcəksiniz. O, default() metodu əvəzinə çağırılır.

Diqqət yetirməli olan başqa bir şey də odur ki, biz json modulunun başa düşdüyü kompleks ədədin real və xəyali hissəsini dəfndə qaytarırıq.

Default() metodunu ləğv etmək əvəzinə, alternativ yanaşma JSONEncoder standart sinfi altında 'ComplexEncoder' adlı alt sinif yaratmaqdır.

class ComplexEncoder(json.JSONEncoder):
    def default(self,z):
        if isinstance(z,complex):
            return (z.real,z.imag)
        else:
            return super().default(z)

Biz deyilik tip xətasını idarə etmək kodda biz baza sinfinə onu idarə etməyə icazə veririk. İndi kompleks ədədləri kodlaşdırmaq üçün iki seçimimiz var. Biz ya dump() metodunda ComplexEncoder sinfindən istifadə etmişik, ya da onun üçün obyekt yarada və encode() metodunu çağıra bilərik.

>>> json.dumps(2+5j,cls=ComplexEncoder)
'[2.0, 5.0]'
>>> encoder=ComplexEncoder()
>>> encoder.encode(2+5j)
'[2.0, 5.0]'

Fərdi məlumat növlərinin dekodlanması:

Mürəkkəb ədədin həqiqi və xəyali ədədlərinə sahib olsaq da, mürəkkəb ədədi yenidən yaratmaq kifayətdirmi? Xeyr, görək, biz kodlaşdırma funksiyamızın çıxışını deşifrə etdikdə, əvəzində nə alırıq.

>>> json_format=json.dumps(2+5j,cls=ComplexEncoder)
>>> json.loads(json_format)
[2.0, 5.0]

Əldə etməli olduğumuz şey mürəkkəb bir rəqəmdir, amma əslində əldə etdiyimiz yalnız bir siyahıdır. Kompleks ədədi yenidən yaratmalı olsaq, dəyərləri kompleks konstruktora ötürməliyik. Bizim əldən verdiyimiz şey metadatadır.

Metadatanı Anlamaq:

Metadata obyekti yenidən yaratmaq üçün kifayət və zəruri olan minimum məlumat miqdarı deməkdir.

json modulu bütün fərdi məlumat növlərinin başa düşülən formatda təqdim edilməsini istəyir. Gəlin kompleks_data.json adlı fayl yaradaq və bütün metadata məlumatlarını əlavə edək. Kompleks ədədi təmsil edən aşağıdakı obyekt metadata məlumatıdır, onu fayla əlavə edin.

{
    "__complex__": true,
    "real": 2,
    "imag": 5
}

Burada əsas __kompleks__ axtardığımız metadatadır. Siz __kompleks__ düyməsinə hər hansı bir dəyər təyin edirsiniz, fərqi yoxdur. Bizim edəcəyimiz yeganə şey açarın mövcud olub olmadığını yoxlamaqdır.

def decode_complex_number(dct):
    if '__complex__' in dct:
        return complex(dct['real'],dct['imag'])
    return dct

Kodlaşdırma üçün etdiyimiz kimi, kompleks ədədi deşifrə etmək üçün öz funksiyamızı yazırıq. İstənilən digər fərdi məlumat növləri üçün biz standart dekoderin idarə etməsinə icazə veririk.

load() metodu çağırılanda biz istəyirik ki, öz dekoderimiz baza dekoderinin idarə etməsinə icazə vermək əvəzinə verilənləri deşifrə etsin. Buna nail olmaq üçün deşifrələmə funksiyamızın object_hook parametrinə keçməsinə ehtiyacımız var.

with open('complex_data.json','r') as data_file:
    data = data_file.read()
    z=json.loads(data,object_hook=decode_complex_number)

çıxış olacaq:

>>> z
(2+5j)
>>> type(z)
<class 'complex'>

Obyekt_hook standart dumps() metoduna bənzəyir. Əgər birdən çox kompleks nömrəniz varsa, onu kompleks_data.json-a əlavə edib kodu yenidən işə sala bilərsiniz.

[
  {
      "__complex__": true,
      "real": 2,
      "imag": 5
  },
  {
      "__complex__": true,
      "real": 7,
      "imag": 10
  },
  {
      "__complex__": true,
      "real": 13,
      "imag": 15
  }
]

İndi çıxışımız kompleks nömrələrin siyahısı olacaq.

>>> z
[(2+5j), (7+10j), (13+15j)]

JSONEncoder sinfi altında öz kodlayıcı sinifimizi əlavə etdiyimiz kimi, object_hook-u ləğv etmək əvəzinə JSONDecoder sinfi altında öz dekoder sinifimiz ola bilər.

class ComplexDecoder(json.JSONDecoder):
    def __init__(self,*args,**kwargs):
        super().__init__(object_hook=self.object_hook, *args, **kwargs)
    def object_hook(self,dct):
        if '__complex__' in dct:
            return complex(dct['real'],dct['imag'])
        else:
            return super().decode(dct)

with open('complex_data.json','r') as data_file:
    data = data_file.read()
    z=json.loads(data,cls=ComplexDecoder)
    print(z)

Nəticə:

Bu məqalədə Python ilə JSON haqqında oxumuşuq. İndiyə qədər öyrəndiklərimizdən vacib məqamları xatırlamağa çalışaq.

  • Daxili json paketini idxal edin
  • load və ya loads() istifadə edərək məlumatları oxuyun
  • Məlumatları emal edin
  • Dump() və ya dumps() istifadə edərək işlənmişləri yazın.
  • Fərdi məlumat növü ilə məşğul olursunuzsa, metadata əldə edin və məlumatları oxumaq və yazmaq üçün öz dekoderinizi və kodlayıcınızı yazın.
Translate »