2.28. JSON¶
JSON (JavaScript Object Notation) הוא פורמט טקסט קומפקטי וקריא לאדם עבור נתונים מובנים. הוא מגדיר שישה טיפוסים – מחרוזת, מספר, בוליאני, null, מערך, ואובייקט – שכל אחד מהם ממופה ישירות לערך Python, כך שהמרה בין Python ל-JSON היא קריאת פונקציה יחידה בכל אחד מהכיוונים.
JSON הוא השפה המשותפת של קובצי תצורה ו-web APIs. השתמשו בו בכל פעם שאתם צריכים לשמור חבילה קטנה של הגדרות לדיסק בצורה שאפשר גם לקרוא בעין, או להחליף נתונים מובנים עם תוכנית אחרת.
שתי פונקציות מכסות את רוב הצרכים:
json.dumps()– dump string: הפיכת ערך Python למחרוזת JSON.json.loads()– load string: ניתוח מחרוזת JSON בחזרה ל-Python.
הזוג json.dump / json.load (ללא s) עושה את אותה עבודה אך מקבל אובייקט קובץ ישירות.
2.28.1. קידוד (dumps)¶
import json
config = {
"name": "OpenMV",
"width": 320,
"tags": ["red", "round"],
}
text = json.dumps(config)
print(text)
פלט:
{"name": "OpenMV", "width": 320, "tags": ["red", "round"]}
המיפוי הוא:
כל דבר מחוץ לקבוצה הזו (מחלקה מותאמת אישית, חוצץ bytes, set) זורק TypeError. המירו את הערך תחילה.
הערה
ה-json.dumps() של CPython מקבל ארגומנט indent לפלט מודפס יפה; זה של MicroPython לא. כפתור העיצוב היחיד הוא separators, ששולט על הריווח הפנימי – העבירו (',', ':') לצורה הקומפקטית ביותר. פלט רב-שורתי ומוזח צריך להיווצר ידנית במידת הצורך.
2.28.2. פענוח (loads)¶
text = '{"name": "OpenMV", "width": 320}'
config = json.loads(text)
print(config["name"], config["width"])
פלט:
OpenMV 320
אובייקטי JSON הופכים ל-dict, מערכים הופכים ל-list, והשאר ממופים בחזרה למקבילות ה-Python שלהם. JSON שגוי זורק ValueError.
2.28.3. קריאה וכתיבה של קבצים¶
הזוג מבוסס-הקבצים משתלב יפה עם with:
import json
with open("config.json") as f:
config = json.load(f)
config["width"] = 640
with open("config.json", "w") as f:
json.dump(config, f)
התייחסו לקובץ ה-JSON כרשומה שלמה – קראו אותו פנימה, שנו את ערך ה-Python, כתבו אותו בחזרה. ניסיון לערוך JSON במקום בתוך קובץ בדרך כלל יוצר יותר באגים ממה שהוא חוסך.