Menu
Coddy logo textTech

קידוד 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, וכך להפוך את סריאליזציית הנתונים לגמישה ורבת עוצמה יותר.

quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

challenge icon

אתגר

קל

צרו מקודד JSON מותאם אישית למחלקה ComplexNumber. המקודד צריך להמיר מספרים מרוכבים לאובייקט JSON עם המפתחות 'real' ו-'imag' עבור החלק הממשי והחלק המדומה, בהתאמה.

  1. הגדירו מחלקה ComplexNumber עם המאפיינים real ו-imag.
  2. צרו תת-מחלקה מותאמת אישית של JSONEncoder שמטפלת באובייקטים מסוג ComplexNumber.
  3. ממשו פונקציה שמקבלת רשימה של אובייקטים מסוג 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 אונליין