קידוד JSON מותאם אישית
שיעור 6 מתוך 9 בקורס JSON ב-Python של Coddy.
קידוד JSON מותאם אישית הוא תכונה רבת עוצמה במודול json של Python, שמאפשרת לבצע סריאליזציה של אובייקטים מורכבים של Python ש-JSON אינו תומך בהם באופן מובנה. הדבר שימושי במיוחד בעבודה עם מחלקות מותאמות אישית או אובייקטים שאין להם ייצוג JSON ישיר.
המחלקה JSONEncoder
כדי ליצור מקודד JSON מותאם אישית, צריך ליצור תת-מחלקה של המחלקה json.JSONEncoder ולדרוס את המתודה default() שלה:
import json
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, YourCustomClass):
return obj.to_dict() # המר את האובייקט שלך למילון
return json.JSONEncoder.default(self, obj)
שימוש במקודד המותאם אישית
לאחר שהגדרת את המקודד המותאם אישית, אפשר להשתמש בו עם json.dumps() או json.dump():
json_string = json.dumps(your_object, cls=CustomEncoder)
דוגמה: קידוד מחלקה מותאמת אישית
נבחן דוגמה מעשית:
import json
from datetime import datetime
class Person:
def __init__(self, name, birthdate):
self.name = name
self.birthdate = birthdate
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Person):
return {"name": obj.name, "birthdate": obj.birthdate.isoformat()}
elif isinstance(obj, datetime):
return obj.isoformat()
return json.JSONEncoder.default(self, obj)
person = Person("Alice", datetime(1990, 5, 15))
json_string = json.dumps(person, cls=CustomEncoder, indent=2)
print(json_string)
הדוגמה הזו מדגימה כיצד לקודד את המחלקה המותאמת אישית Person ולטפל באובייקט datetime שבתוכה.
נקודות חשובות
- המתודה
default()נקראת עבור אובייקטים שאינם ניתנים לסריאליזציה באופן מובנה. - יש תמיד לספק דרך לחזור למקודד ברירת המחדל עבור טיפוסים לא מוכרים.
- מקודדים מותאמים אישית שימושיים לטיפול במבני נתונים מורכבים, במחלקות מותאמות אישית ובטיפוסי Python שאינם סטנדרטיים.
באמצעות מקודדי JSON מותאמים אישית, אפשר לשלב בצורה חלקה את אובייקטי Python המורכבים שלך בתהליכי עבודה עם JSON, וכך להפוך את סריאליזציית הנתונים לגמישה ורבת עוצמה יותר.
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
אתגר
קלצרו מקודד JSON מותאם אישית למחלקה ComplexNumber. המקודד צריך להמיר מספרים מרוכבים לאובייקט JSON עם המפתחות 'real' ו-'imag' עבור החלק הממשי והחלק המדומה, בהתאמה.
- הגדירו מחלקה
ComplexNumberעם המאפייניםrealו-imag. - צרו תת-מחלקה מותאמת אישית של
JSONEncoderשמטפלת באובייקטים מסוגComplexNumber. - ממשו פונקציה שמקבלת רשימה של אובייקטים מסוג
ComplexNumberומחזירה ייצוג של מחרוזת JSON באמצעות המקודד המותאם אישית.
הקלט הבא יסופק:
3.14,2.71
1.41,-1.73
2.0,0
0,-1
כל שורה מייצגת מספר מרוכב, שבו החלקים הממשי והמדומה מופרדים בפסיק.
הדפיסו את מחרוזת ה-JSON שהתקבלה. ודאו שה-JSON מעוצב עם הזחה של 2 רווחים.
נסו בעצמכם
import json
# קראו את הקלט
complex_numbers = []
while True:
try:
line = input().strip()
if line:
real, imag = map(float, line.split(','))
complex_numbers.append((real, imag))
except EOFError:
break
class ComplexNumber:
def __init__(self, real, imag):
self.real = real
self.imag = imag
# TODO: צרו תת־מחלקה מותאמת אישית של JSONEncoder שמטפלת באובייקטים מסוג ComplexNumber
# TODO: ממשו פונקציה שמקבלת רשימה של אובייקטים מסוג ComplexNumber ומחזירה מחרוזת JSON
# TODO: המירו את נתוני הקלט לאובייקטים מסוג ComplexNumber והשתמשו בפונקציה שלכם כדי ליצור את מחרוזת ה-JSON
# הדפיסו את מחרוזת ה-JSON שהתקבלה
print(json_string)כל השיעורים ביחידה JSON ב-Python
תרגלו בעצמכם: קומפיילר Python אונליין