Python-той JSON

Системийн дизайны ярилцлагын асуултууд маш нээлттэй байж болох тул зөв бэлтгэх арга замыг мэдэхэд хэтэрхий хэцүү байдаг. Одоо би худалдаж авсны дараа Amazon, Microsoft, Adobe-ийн дизайныг эвдэх боломжтой болсон энэ ном. Өдөр бүр нэг засвар хийх дизайны асуулт Мөн би та дизайны дугуйг эвдэж чадна гэж амлаж байна.

JSON гэж юу вэ?

JSON нь JavaScript Object Notation гэсэн үгийн товчлол юм. Энэ нь JavaScript синтакс дээр суурилдаг. Синтаксийн хувьд JSON формат нь JavaScript объект үүсгэх кодтой төстэй юм. Хэдийгээр JSON нь Javascript дээр суурилдаг ч JSON нь Javascript-ээс ялгаатай бөгөөд зарим нь JavaScript-ээс ялгаатай үгүй биш JSON. Энэ нийтлэлээс бид JSON-ийг Python-той хэрхэн ашиглах талаар сурах болно.

JSON нь хэлнээс бүрэн хамааралгүй текстийн формат бөгөөд нэгэн зэрэг C, C++, C#, Java, JavaScript, Perl гэх мэт C бүлгийн хэлнүүдийн програмистуудад танил болсон конвенцуудыг ашигладаг. Python, болон бусад олон. Ийм учраас JSON нь өгөгдөл солилцоход тохиромжтой хэл гэж тооцогддог.

Сүлжээний холболтоор бүтэцлэгдсэн өгөгдлийг цуваа болгох, дамжуулахын тулд JSON-ийг ихэвчлэн ашигладаг. Хэдийгээр XML-ийг ижил зорилгоор ашигладаг ч бид JSON-ийг үндсэндээ сервер болон сервер хооронд өгөгдөл дамжуулахад ашигладаг вэб програм. JSON нь хөнгөн тул XML-ээс илүүд үздэг. Та JSON-ийн талаарх дэлгэрэнгүй мэдээллийг албан ёсны хуудаснаас авах боломжтой JSON вэб сайт.

JSON объект:

JSON объект нь JavaScript объектууд болон Python толь бичигтэй төстэй харагдаж байна. JavaScript объектууд болон Python толь бичгүүдийн нэгэн адил JSON объект нь буржгар хаалтаар хүрээлэгдсэн эрэмбэлэгдээгүй нэр болон утгын хос юм. Нэр-утга хосыг давхар хашилтанд нэр, дараа нь хоёр цэг, дараа нь утгаараа илэрхийлнэ.

{
"Name":"John"
}

Объект нь олон нэр-утга хос, нэр-утга хос агуулсан байж болно. Нэр-утга таслалаар тусгаарлагдана.

{
  "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 бас дэмждэг өгөгдлийн төрлүүд тоо, мөр, жагсаалт, объект гэх мэт.

Python-той JSON:

Зарим кодын жишээн дээр Python дээр JSON өгөгдлийг хэрхэн ойлгохыг ойлгож эхэлцгээе. Python нь JSON өгөгдөлтэй ажиллахад ашиглах боломжтой json багцтай ирдэг. Бид энэ багцыг ашиглахын тулд Python скрипт дээрээ json-г импортлох хэрэгтэй.

import json

Цуврал болон цуваа арилгах:

JSON өгөгдлийг санах ойд хадгалах эсвэл сүлжээгээр хуваалцах хэд хэдэн байт болгон хөрвүүлэх үйл явцыг кодчилол гэж нэрлэдэг. Цувралчлал нь JSON өгөгдлийг кодлох үйл явц юм.

Цуваачлалын урвуу үйл явц нь Deserialization юм. Өгөгдлийн кодыг тайлах үйл явцыг Deserialization гэж нэрлэдэг.

Энгийнээр хэлбэл, цуваа болгох, салгах нь өгөгдлийг санах ойд бичих, унших гэсэн үг юм. Кодчилол нь өгөгдөл бичих, тайлах нь өгөгдлийг уншихад зориулагдсан.

JSON өгөгдлийг цуврал болгох:

Python-ийн суурилуулсан json багц нь Python объектуудыг JSON болгон хөрвүүлэх dump() болон dumps() аргыг өгдөг. Эдгээр хоёр аргын ялгааг харцгаая:

dump() овоолго()
dump() нь Python объектуудыг JSON объект руу хөрвүүлж файл руу бичдэг. Python объектыг JSON стринг болгон хөрвүүлэхийн тулд dumps() ашигладаг
Өгөгдлийг хадгалах гаралтын файлыг аргумент болгон дамжуулах ёстой Файлын нэр шаардлагагүй
Дампаас хурдан() Дампаас удаан()

Доорх хүснэгтэд Python объектуудыг JSON объект руу хэрхэн хөрвүүлэхийг тайлбарласан болно.

Python объект Үүнтэй ижил JSON объект
Дикт Обьект
Жагсаалт Array
Tuple Array
гудамж String
INT тоо
° в ° гч тоо
Үнэн үнэн
хуурамч хуурамч
Аль нь ч биш тэг

dump() жишээ:

Python объектыг JSON объект руу хөрвүүлж, dump() аргыг ашиглан файлд хадгалах жишээг харцгаая. Энэ бол бидний python өгөгдөл юм

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

Мөн Python код нь:

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

dump() нь хоёр аргумент авдаг:

  • python_өгөгдөл
  • filename-Data_file.json, энэ нь JSON объектыг хадгалах гаралтын файл юм.

dumps() жишээ:

dumps() арга нь Python объектыг JSON мөр болгон хувиргадаг.

json_string=json.dumps(python_data)

Энд бид dump() дээр хийсэн шиг бусад аргументын файлын нэрийг дамжуулахгүй байгаа бөгөөд энэ нь шаардлагагүй юм.

dump() ба dumps() түлхүүр үгийн аргументууд:

догол мөр:

Хэдийгээр JSON нь уншихад хялбар боловч зөв форматлагдсан тохиолдолд уншихад илүү хялбар болдог. Та үүрлэсэн бүтцийн догол мөрийг өөрчлөхийн тулд indent нэртэй нэмэлт түлхүүр үгийн аргумент ашиглаж болно. Доорх кодыг ажиллуулаад догол мөр ашиглан форматын ялгааг анзаараарай.

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

тусгаарлагч:

Форматыг өөрчлөхөд ашиглаж болох өөр нэг түлхүүр үгийн аргумент бол тусгаарлагч юм. Тусгаарлагч нь (зүйл_тусгаарлагч, түлхүүр_салгагч) залгуур юм. Өгөгдмөл утга нь (', ',': '). Хамгийн авсаархан JSON-г авахын тулд хоосон зайг арилгадаг (',',':') ашиглана уу.

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

харна уу Docs түлхүүр үг аргументуудын нэмэлт жагсаалтын хувьд.

JSON өгөгдлийг цувралаас гаргах:

Цувралгүй болгох нь JSON объектуудыг тус тусын Python объект руу хөрвүүлдэг. Бид load() болон loads()-г цувралаас ангижруулахад ашиглаж болно.

load() нь өгөгдлөө файлаас авдаг бол loads() нь string объектоос өгөгдлийг авдаг.

Доорх хүснэгтүүд JSON объектуудыг тус тусын Python объект руу хэрхэн хөрвүүлдэг болохыг тайлбарлав:

JSON объект Python объект
объект дикт
массив жагсаалт
мөр гудамж
тэг Аль нь ч биш
тоо (int) INT
тоо (бодит) ° в ° гч
үнэн Үнэн
хуурамч хуурамч

Энэ хүснэгт нь бидний цуваа хэлбэрээр харсан хүснэгтээс яг эсрэгээрээ биш юм. Учир нь бид объектыг кодлох үед код тайлсны дараа ижил объектыг буцааж авахгүй байж магадгүй юм.

Доорх жишээг шалгана уу, бид tuple кодчилж байна. JSON объектын tuple эквивалент нь массив юм. Массивын кодыг тайлах нь жагсаалт гарч ирнэ. Тиймээс tuple-ийг кодлох, тайлах нь жагсаалтад хүргэдэг.

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() жишээ:

load() арга нь JSON объектыг Python объект руу хөрвүүлж, файлаас оролтыг авдаг. Өгөгдлийг цувуулж байх үед бид Data_file.json үүсгэсэн гэдгийг санаарай. Энд ижил файлыг ашиглацгаая.

import json

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

print(data)

Хэрэв та үүнийг хийхгүй бол өгөгдлийн төрөл Та ачаалж байгаа бол үр дүнгийн өгөгдлийн төрөл нь хөрвүүлэх хүснэгтэд байгаа бүх зүйл байж болно гэдгийг санаарай.

loads() жишээ:

loads() нь файлын оронд стрингээс оролтыг авдаг.

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))

Бодит цагийн жишээ:

Дадлага хийхийн тулд ашиглацгаая JSONPlaceholder, энэ нь жишээ JSON өгөгдлийг өгдөг. Бид API хүсэлт илгээснээр JSONPlaceholder үйлчилгээнээс өгөгдлийг авах боломжтой. Python нь API дуудлага хийхэд ашиглах боломжтой "хүсэлт" нэртэй багцыг өгдөг.

Python файлыг өөрийн сонгосон нэрээр, хүссэн газраа үүсгээд доорх багцуудыг импортло.

import json
import requests

Бид /todos төгсгөлийн цэгийн JSONPlaceholder үйлчилгээнд API хүсэлт гаргах шаардлагатай байна. API дуудлага амжилттай болсон үед бид 200-г статусын код болгон авах болно.

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

Хариулах объектын текстийн атрибутыг цувралаас гаргахын тулд бид json.loads эсвэл json() аргыг ашиглаж болно. Дээр дурдсанчлан ачаалал нь json функц бөгөөд энэ нь зөвхөн мөрийн өгөгдлийг задлан шинжлэхэд төдийгүй хүсэлтийн контекстэд ашиглагдах боломжтой юм.

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

.json нь ангийн хүсэлт.загвар.Хариултын арга юм. Энэ нь хүсэлтийн хариултаас json өгөгдлийг буцаана.

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

Хэдийгээр json.loads болон .json-ийн гаралт ижил байна.

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

Хэрэв та кодыг өөрчлөх болгондоо Python файл болон терминал хооронд шилжихэд хэцүү байвал интерактив горимд скриптээ ажиллуулах нь тохиромжтой. Скриптийг ажиллуулах үед та -i-г ашиглан интерактив горимд ажиллах боломжтой. Давуу тал нь энэ нь зөвхөн скриптийг ажиллуулдаг төдийгүй та бас чадна бүх өгөгдөлд хандах терминал дахь скриптээс өөрөө.

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

Responsive.json() арга нь жагсаалтыг буцаана. Та буцаасан зүйлээр жагсаалтын бүх үйлдлийг хийж болно.

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

Хийх зүйл хэрхэн харагдах талаар санаа авахын тулд бид санамсаргүй зүйлсийг хэвлэж байна. Та мөн хөтөч дээрх төгсгөлийн цэгт зочилж тухайн зүйлийг үзэж болно.

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

Python-той JSONPin

Хамгийн их даалгавар гүйцэтгэсэн хэрэглэгчдийг олох:

Хэрэв та өгөгдлүүдийг харвал тус бүр нь өвөрмөц хэрэглэгчийн ID-тай олон хэрэглэгчид байгааг олж мэдэх бөгөөд хийх зүйл бүр нь "дууссан" гэсэн өмчтэй байдаг. Аль хэрэглэгчид хамгийн их даалгавраа гүйцэтгэсэн болохыг олж мэдье.

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

урвуу дараалал

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

#Gets the

хамгийн их тоо

 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)

Одоо бид дуусгасан хэрэглэгчдийн жагсаалтыг гаргалаа хамгийн их тоо todos. Гаралтыг сайхан хэвлэхийг хичээцгээе.

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

Гаралт нь дараах байдалтай байна.

Users 5 and 10 and 8 completed 12 TODOs

Одоо "completed_todos.json" нэртэй json файлыг үүсгэцгээе. Энэ нь файлыг дуусгасан хэрэглэгчдийн гүйцэтгэсэн todos-ыг агуулсан. хамгийн их тоо 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)

Хэрэв та filter() аргыг мэдэхгүй бол filter() арга нь дарааллын элемент бүрийг үнэн эсвэл худал гэдгийг баталгаажуулах функцын тусламжтайгаар дарааллыг шүүдэг.

Энд filter() арга нь filtered_todos() хэмээх функцийг ашиглаж байгаа бөгөөд энэ нь хэрэглэгчийн id хамгийн их хийх ажлыг гүйцэтгэсэн хэрэглэгчдийн жагсаалтад байгаа эсэхийг шалгах ба тухайн хэрэглэгчийн хувьд хийх ажил дууссан эсэхийг шалгадаг. Хэрэв хоёр нөхцөл үнэн бол бид dump() аргыг ашиглан гаралтын файлдаа хийх ажлыг бичиж байна.

“completed_todos.json” гаралтын файл нь зөвхөн хамгийн их хийх ажлыг гүйцэтгэсэн хэрэглэгчдийн гүйцэтгэсэн ажлын жагсаалтыг агуулна.

Захиалгат Python объектуудыг цуваа болгох ба цувралаас хасах:

Өөрийнхөө тусгай питон объектыг бүтээцгээе.

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()

Бид EmployeeDetails нэртэй класс болон ажилтны нэрийг буцаах аргыг үүсгэж байна. Үүнд зориулж объект бүтээцгээе.

Одоо emp_name хувьсагчийг цуваа болгож, юу болохыг хараарай.

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

Мөр төрлийн emp_name цуваа болгоход бидэнд ямар ч асуудал гарахгүй. Бидний үүсгэсэн python объектын эмпийг цуваа болгохыг оролдоход юу болохыг харна уу.

>>> 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

Бид "Ажилтны дэлгэрэнгүй мэдээлэл" JSON-н цуваачлах боломжгүй гэсэн алдааг авч байна. Хэдийгээр бид python-ийн ихэнх өгөгдлийн төрлийг кодлож чаддаг ч json модуль нь өөрчлөн тохируулсан питон объектуудыг хэрхэн цуваа болгохыг мэдэхгүй байна.

Өгөгдлийн бүтцийг хялбарчлах:

Захиалгат объектыг шууд кодлох гэж оролдохын оронд бидний хийж чадах зүйл бол захиалгат объектыг json модулийн ойлгодог өөр дүрслэл болгон хувиргаж, дараа нь JSON болгон хөрвүүлэх явдал юм.

Энэ нь хэрхэн ажилладагийг жишээний тусламжтайгаар ойлгоцгооё. Цогцолбор тоонуудыг илэрхийлэхийн тулд Python нь суулгасан тоог өгдөг өгөгдлийн төрөл "цогцолбор". Комплекс тоог a+bj форматаар илэрхийлдэг бөгөөд 'a' нь бодит хэсэг, 'b' нь төсөөллийн хэсэг юм.

>>> 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

Комплекс тоонууд нь JSON-оор цуварч болохгүй тул нийлмэл тоог json модулийн ойлгодог формат руу хөрвүүлэхийг оролдъё.

Цогцолбор тоо үүсгэхийн тулд бидэнд зөвхөн бодит хэсэг, төсөөлөн бодох хэсэг л хэрэгтэй.

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

Бодит ба төсөөллийн хэсгийг цогц байгуулагч руу шилжүүлэхэд бид комплекс тоо гарна.

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

Ёс заншлыг хэрхэн зөрчихийг ойлгох нь чухал өгөгдлийн төрөл цуваа болгож, цувралаас гаргахын тулд түүний чухал бүрэлдэхүүн хэсгүүдэд.

Тусгай өгөгдлийн төрлийг кодлох:

Одоо бид цогцолбор тоо үүсгэх бүх чухал бүрэлдэхүүн хэсгүүдтэй байна. Комплекс тоог JSON руу хөрвүүлэхийн тулд бидний хийж чадах зүйл бол өөрийн кодчилолын функцийг үүсгэж, үүнийг dump() арга руу шилжүүлэх явдал юм.

Цогцолбор тоонуудыг кодлоход ашиглаж болох аргыг доор харуулав. Нарийн төвөгтэй тооноос гадна бид өөр ямар нэгэн захиалгат өгөгдлийн төрлийг функцэд оруулбал энэ нь төрлийн алдаа гаргах болно.

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 цуваачлах боломжгүй өөрчлөн өгөгдлийн төрлийг хөрвүүлэхийг оролдох бүрд бидний кодчилолын функц дуудагдах болно.

>>> 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

Одоо бид 'code_complex_numbers' функцийг ашиглан комплекс тоонуудыг цуваа болгож болохыг анхаарна уу. Бусад захиалгат өгөгдлийн төрлүүдийн хувьд бид төрлийн алдаа гарна. Та алдааг манай кодоос хэвлэсэн гэдгийг хэрхэн мэдэх талаар асуулт гарч ирж магадгүй юм. Тодруулсан мөрийг анзаараарай, дээж нь миний кодчилолын функц байгаа файлын нэр бөгөөд та тэр газарт өөрийн файлын нэрийг харах болно. Энэ нь default() аргын оронд дуудагддаг.

Бас нэг анхаарах зүйл бол бид json модулийн ойлгодог нийлмэл тооны бодит болон зохиомол хэсгийг tuple хэлбэрээр буцааж байгаа явдал юм.

Анхдагч() аргыг хүчингүй болгохын оронд JSONEncoder стандарт ангийн доор 'ComplexEncoder' нэртэй дэд анги үүсгэх нь өөр арга юм.

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

Бид биш юм төрлийн алдаатай ажиллах кодонд бид үндсэн ангид үүнийг зохицуулахыг зөвшөөрч байна. Одоо бидэнд нийлмэл тоонуудыг кодлох хоёр сонголт байна. Бид dump() аргад ComplexEncoder класс ашиглах эсвэл түүнд зориулж объект үүсгэж, encode() аргыг дуудаж болно.

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

Тусгай өгөгдлийн төрлийг тайлах:

Хэдийгээр бид нийлмэл тооны бодит болон төсөөлөлтэй тоонууд байгаа ч нийлмэл тоог дахин бүтээхэд хангалттай юу? Үгүй ээ, бид кодчилолынхоо гаралтыг тайлахад хариуд нь юу авахыг харцгаая.

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

Бидний авах ёстой зүйл бол нийлмэл тоо, гэхдээ бидний олж авсан зүйл бол зүгээр л жагсаалт юм. Хэрэв бид нийлмэл тоог дахин үүсгэх шаардлагатай бол утгуудыг цогцолбор байгуулагч руу дамжуулах ёстой. Бидний алдсан зүйл бол мета өгөгдөл юм.

Мета өгөгдлийг ойлгох:

Мета өгөгдөл гэдэг нь тухайн объектыг дахин бүтээхэд хангалттай бөгөөд шаардлагатай мэдээллийн хамгийн бага хэмжээг хэлнэ.

json модуль нь бүх захиалгат өгөгдлийн төрлийг ойлгомжтой форматаар харуулахыг хүсдэг. Complex_data.json нэртэй файл үүсгээд бүх мета өгөгдлийн мэдээллийг оруулъя. Комплекс тоог илэрхийлэх дараах объект нь мета өгөгдлийн мэдээлэл бөгөөд үүнийг файлд нэмнэ үү.

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

Энд гол __цогцолбор__ нь бидний хайж буй мета өгөгдөл юм. Та __комплекс__ түлхүүрт ямар ч утгыг оноож болно, энэ нь хамаагүй. Бидний хийх зүйл бол түлхүүр байгаа эсэхийг шалгах явдал юм.

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

Бид кодчилол хийсэн шиг нийлмэл тоог тайлах функцээ бичиж байна. Бусад захиалгат өгөгдлийн төрлүүдийн хувьд бид өгөгдмөл декодлогчоор ажиллахыг зөвшөөрч байна.

load() аргыг дуудах болгонд бид үндсэн декодлогчийг ажиллахыг зөвшөөрөхийн оронд өөрийн декодлогч өгөгдлийг тайлахыг хүсдэг. Үүнд хүрэхийн тулд бидэнд код тайлах функцийг object_hook параметрт шилжүүлэх шаардлагатай.

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

Гаралт нь:

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

object_hook нь dumps()-ын анхдагч аргатай төстэй. Хэрэв танд нэгээс олон нийлмэл тоо байгаа бол та үүнийг kompleks_data.json-д нэмж кодыг дахин ажиллуулж болно.

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

Одоо бидний гаралт нь нийлмэл тоонуудын жагсаалт байх болно.

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

JSONEncoder ангид өөрийн кодлогч анги нэмсэнтэй адил бид object_hook-ыг дарж бичихийн оронд JSONDecoder анги дор өөрийн код тайлагч ангитай байж болно.

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)

Дүгнэлт:

Бид энэ нийтлэлээс Python-той JSON-ийн талаар уншсан. Өнөөг хүртэл сурсан зүйлийнхээ чухал санааг санахыг хичээцгээе.

  • Баригдсан json багцыг импортлох
  • Ачаалал эсвэл ачааллыг ашиглан өгөгдлийг уншина уу ()
  • Өгөгдлийг боловсруулах
  • Боловсруулсаныг dump() эсвэл dumps() ашиглан бичнэ үү.
  • Хэрэв та захиалгат өгөгдлийн төрлийг ашиглаж байгаа бол мета өгөгдлийг авч, өгөгдлийг уншиж, бичихийн тулд өөрийн декодер, кодлогчийг бичээрэй.
Crack системийн дизайны ярилцлага
Translate »