דילוג לתוכן המרכזי
מודול 8 · שיעור 1 מתוך 429/36 בקורס~10 min
שיעורי מודול (1/4)

JSON: הסדר וניתוח

JSON הוא פורמט חילופי הנתונים הנפוץ ביותר. מודול json ב הספרייה הסטנדרטית מטפלת בזה באופן טבעי.

מ-Python ל-JSON: dumps

json.dumps(object) מסדרת אובייקט Python למחרוזת JSON.

Python
import json

dati = {"nome": "Ada", "anni": 36, "skills": ["python", "matematica"]}
json.dumps(dati)
# '{"nome": "Ada", "anni": 36, "skills": ["python", "matematica"]}'

json.dumps(dati, indent=2, sort_keys=True)
# multi-line formatted string, keys sorted

מ-JSON לפייתון: loads

json.loads(string) מנתח מחרוזת JSON ומחזירה אובייקטים של Python.

Python
testo = '{"nome": "Ada", "anni": 36}'
d = json.loads(testo)
d["nome"]    # 'Ada'
type(d)      # <class 'dict'>

סוג מיפוי

JSONפייתון
objectdict
arraylist
stringstr
numberint / float
trueTrue
falseFalse
nullNone

מתוך קובץ: dump / load

Python
with open("config.json", "w") as f:
    json.dump(dati, f, indent=2)

with open("config.json") as f:
    dati = json.load(f)

ללא ה-s הנגררים הם עובדים על קבצים (דמוי קובץ), עם ה-s על מחרוזות.

סוגים שאינם ניתנים לסידרה: default

datetime, set, המחלקות המותאמות אישית שלך אינן ניתנות לסידרה כברירת מחדל:

Python
import datetime, json
json.dumps({"ora": datetime.datetime.now()})
# TypeError: Object of type datetime is not JSON serializable

אתה יכול להעביר פונקציה default שאומרת כיצד לשנות אותם:

Python
def converti(obj):
    if isinstance(obj, datetime.datetime):
        return obj.isoformat()
    if isinstance(obj, set):
        return list(obj)
    raise TypeError(f"non serializzabile: {type(obj)}")

json.dumps({"ora": datetime.datetime.now()}, default=converti)

JSON ופעולות קבצים

הספרייה הסטנדרטית מספקת גם json.dump() וjson.load() (ללא ה-'s') כדי לכתוב ולקרוא נתוני JSON ישירות אל ומקבצים, תוך התאמה טבעית עם מנהלי הקשר:

Python
with open("data.json", "w") as f:
    json.dump(data, f)

נסה את זה

פעילות גופנית#python.m8.l1.e1
ניסיונות: 0טוען...

בהינתן `data = {'nome': 'Ada', 'anni': 36}`, עשה אותו בסידרה ל-JSON עם indent=2 והקצה למשתנה `json_str`. הערך את 'json_str'.

טוען עורך...
הצג רמז

json.dumps(data, indent=2)

הפתרון זמין לאחר 3 ניסיונות

סקירת התרגיל

פעילות גופנית#python.m8.l1.e2
ניסיונות: 0טוען...

בהינתן מחרוזת JSON s = '[{"nome": "a", "v": 1}, {"nome": "b", "v": 2}]', נתח אותה עם json.loads לנתונים וחשב את סכום ערכי ה-'v' בסך הכל. הערכת סך הכל.

טוען עורך...
הצג רמז

json.loads מחזיר רשימה של dicts.

הפתרון זמין לאחר 3 ניסיונות

אתגר נוסף

פעילות גופנית#python.m8.l1.e3
ניסיונות: 0טוען...

בהינתן מחרוזת JSON \`json_data = '{"name": "Alice", "age": 30}'\`, פענח אותה למילון Python באמצעות \`json.loads\`. חלץ את הערך המשויך למפתח \`'name'\` ואחסן אותו ב-\`user_name\`. לבסוף, הערך את \`שם_משתמש\`.

טוען עורך...
הצג רמז

השתמש ב-json.loads(json_data) כדי לפענח, ולאחר מכן גש באמצעות נתונים['name'].

הפתרון זמין לאחר 3 ניסיונות