Menu
Coddy logo textTech

פענוח JSON מותאם אישית

שיעור 9 מתוך 9 בקורס JSON ב-Python של Coddy.

פענוח JSON מותאם אישית הוא תכונה מתקדמת של המודול json של Python, שמאפשרת לך לשלוט באופן שבו נתוני JSON מומרים לאובייקטים של Python. התכונה שימושית במיוחד כשעובדים עם מבני נתונים מורכבים או כשמעוניינים ליצור אובייקטים מסוימים של Python מנתוני JSON.

המחלקה JSONDecoder

כדי לממש פענוח JSON מותאם אישית, צריך ליצור מחלקת משנה של המחלקה json.JSONDecoder ולדרוס את המתודה שלה object_hook:


import json

class CustomDecoder(json.JSONDecoder):
    def object_hook(self, dct):
        # כאן ממוקמת לוגיקת פענוח מותאמת אישית
        return dct

שימוש במפענח המותאם אישית

לאחר שהגדרת את המפענח המותאם אישית, אפשר להשתמש בו עם json.loads() או עם json.load():


decoded_object = json.loads(json_string, cls=CustomDecoder)

דוגמה: פענוח לאובייקטים מותאמים אישית

נבחן דוגמה מעשית שבה מפענחים נתוני JSON לאובייקטים מותאמים אישית של Python:


import json
from datetime import datetime

class Person:
    def __init__(self, name, birthdate):
        self.name = name
        self.birthdate = birthdate

class CustomDecoder(json.JSONDecoder):
    def object_hook(self, dct):
        if 'name' in dct and 'birthdate' in dct:
            return Person(dct['name'], datetime.fromisoformat(dct['birthdate']))
        return dct

json_string = '{"name": "Alice", "birthdate": "1990-05-15"}'
person = json.loads(json_string, cls=CustomDecoder)

print(type(person))  # פלט: <class '__main__.Person'>
print(person.name)   # פלט: Alice
print(person.birthdate)  # פלט: 1990-05-15 00:00:00

נקודות עיקריות

  • המתודה object_hook נקראת עבור כל אובייקט שפוענח.
  • אפשר לבדוק מפתחות או תבניות מסוימים כדי לקבוע כיצד לפענח את האובייקט.
  • אם אין צורך בפענוח מותאם אישית עבור מבנה מסוים, יש להחזיר את האובייקט כפי שהוא.
  • מפענחים מותאמים אישית שימושיים ליצירת אובייקטים ייעודיים לתחום ישירות מנתוני JSON.

באמצעות מפענחי JSON מותאמים אישית, אפשר לשלב בצורה חלקה נתוני JSON במודל האובייקטים של אפליקציית Python שלך, וכך להפוך את הסרת הסריאליזציה של הנתונים לגמישה יותר ולהתאימה לצרכים הספציפיים שלך.

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

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

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

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

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

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

challenge icon

אתגר

קל

צרו מפענח JSON מותאם אישית למערכת נתוני מזג אוויר. המפענח אמור להמיר מחרוזות JSON לאובייקטים מסוג WeatherData עם מאפיינים והמרות מסוימים. ממשו את הדברים הבאים:

  1. הגדירו מחלקה בשם WeatherData עם המאפיינים: location, temperature, humidity ו-conditions.
  2. צרו מחלקה מותאמת אישית שיורשת מ-JSONDecoder ושמבצעת את הפעולות הבאות:
    • ממירה את הטמפרטורה מפרנהייט לצלזיוס, עם עיגול לספרה אחת אחרי הנקודה העשרונית.
    • מוודאת שהלחות מיוצגת כאחוז (למשל, 0.65 הופך ל-65%).
    • הופכת את האות הראשונה בכל מילה במחרוזת התנאים לאות גדולה.
  3. ממשו פונקציה שמקבלת מחרוזת JSON, משתמשת במפענח המותאם אישית כדי לנתח אותה, ומחזירה מחרוזת מעוצבת עם נתוני מזג האוויר.

הקלט הבא יסופק:


{"location": "new york", "temperature": 72, "humidity": 0.65, "conditions": "partly cloudy"}

הדפיסו את המחרוזת המעוצבת שהתקבלה בפורמט הבא:

"Location: [location], Temperature: [temp]°C, Humidity: [humidity], Conditions: [conditions]"

נסו בעצמכם

Here's a suitable starter code for the challenge:

```python
import json

# Read input
json_string = input()

class WeatherData:
    def __init__(self, location, temperature, humidity, conditions):
        self.location = location
        self.temperature = temperature
        self.humidity = humidity
        self.conditions = conditions

class CustomJSONDecoder(json.JSONDecoder):
    def __init__(self, *args, **kwargs):
        json.JSONDecoder.__init__(self, object_hook=self.object_hook, *args, **kwargs)

    def object_hook(self, dct):
        # TODO: Implement the custom decoding logic here
        pass

def parse_weather_data(json_string):
    # TODO: Implement the parsing function here
    pass

# TODO: Use the CustomJSONDecoder and parse_weather_data function to process the input

# Placeholder for the result
result = "Location: [location], Temperature: [temp]°C, Humidity: [humidity], Conditions: [conditions]"

# Output the result
print(result)
```

כל השיעורים ביחידה JSON ב-Python

תרגלו בעצמכם: קומפיילר Python אונליין