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"]}

המיפוי הוא:

  • dict (מפתחות מחרוזת) ← אובייקט JSON.

  • list ו-tuple ← מערך JSON.

  • str ← מחרוזת JSON.

  • int, float ← מספר JSON.

  • True, False, Nonetrue, false, null.

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