פענוח 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 שלך, וכך להפוך את הסרת הסריאליזציה של הנתונים לגמישה יותר ולהתאימה לצרכים הספציפיים שלך.
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
אתגר
קלצרו מפענח JSON מותאם אישית למערכת נתוני מזג אוויר. המפענח אמור להמיר מחרוזות JSON לאובייקטים מסוג WeatherData עם מאפיינים והמרות מסוימים. ממשו את הדברים הבאים:
- הגדירו מחלקה בשם
WeatherDataעם המאפיינים:location,temperature,humidityו-conditions. - צרו מחלקה מותאמת אישית שיורשת מ-
JSONDecoderושמבצעת את הפעולות הבאות:- ממירה את הטמפרטורה מפרנהייט לצלזיוס, עם עיגול לספרה אחת אחרי הנקודה העשרונית.
- מוודאת שהלחות מיוצגת כאחוז (למשל, 0.65 הופך ל-65%).
- הופכת את האות הראשונה בכל מילה במחרוזת התנאים לאות גדולה.
- ממשו פונקציה שמקבלת מחרוזת 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 אונליין