[warm]
שלום לכולם וברוכים הבאים לשיעור חמש נקודה ארבע. היום אנחנו צוללים לעומק אחד הנושאים הכי קריטיים בעבודה עם אינטגרציות ו-API: פורמט ה-JSON. נלמד איך לקרוא, לכתוב, ולעבד אותו בפייתון, ובעיקר - איך הוא משמש אותנו בעבודה מול מערכות AI מתקדמות.

[מעבר שקף]

[calm]
בשיעור הקודם, חמש נקודה שלוש, בנינו נקודת קצה, או endpoint, לקבלת Webhooks. דיברנו על כך שכאשר אירוע מתרחש במערכת חיצונית, המערכת שולחת לנו 'עדכון'. העדכון הזה, ה-Payload, כמעט תמיד מגיע בפורמט שנקרא JSON. ראינו דוגמה ל-Payload כזה, אבל התייחסנו אליו כאל 'גוש' של טקסט. המטרה שלנו היום היא להפוך את הגוש הזה למידע שימושי ומובנה שאפשר לעבוד איתו. כדי לעשות את זה, אנחנו חייבים להבין את השפה שבה הוא כתוב, וכאן נלמד את הדקדוק והתחביר שלה. בתמונה לדוגמה של Payload מ-Webhook, שימו לב לסוגריים המסולסלים, למרכאות ולמבנה. בסוף השיעור, תוכלו לקחת מידע כזה ולשלוף ממנו בקלות כל פרט שתרצו.

[מעבר שקף]

[calm, confident]
אז מה זה JSON ולמה הוא הפך לסטנדרט? JSON, ראשי תיבות של JavaScript Object Notation, הוא פורמט טקסטואלי להעברת מידע מובנה. למרות שמו, הוא לא קשור רק לג'אווהסקריפט והפך לשפה האוניברסלית של עולם ה-API. הסיבות המרכזיות לכך הן שתיים: ראשית, הוא קריא מאוד לבני אדם, מה שמקל על פיתוח ודיבאגינג. שנית, הוא קל מאוד למחשבים לפענח. המבנה הפשוט שלו מאפשר לכל שפת תכנות לתרגם אותו בקלות למבני נתונים פנימיים כמו מילונים ורשימות. בעבר השתמשו בפורמטים כמו XML, שהיה הרבה יותר מסורבל. JSON ניצח כי הוא מציע שילוב מושלם בין פשטות, קריאות ועוצמה.

[מעבר שקף]

[calm, confident]
ל-JSON יש שני מבנים בסיסיים. הראשון הוא אובייקט, אוסף של זוגות 'מפתח-ערך', שעטוף בסוגריים מסולסלים. זה מקביל למילון, או dictionary, בפייתון. השני הוא מערך, רשימה סדורה של ערכים שעטופה בסוגריים מרובעים, המקבילה לרשימה, או list, בפייתון. הערכים עצמם יכולים להיות אחד משישה טיפוסים: מחרוזת, מספר, בוליאני, ערך ריק שנקרא null, מערך, או אובייקט. היופי הוא שאפשר לקנן את המבנים האלה אחד בתוך השני, וכך לייצג מידע מורכב מאוד בצורה מאורגנת.

[מעבר שקף]

[calm]
בפייתון, העבודה עם JSON מתבצעת דרך ספריית ברירת מחדל בשם `json`. אין צורך להתקין כלום. יש שתי פונקציות מרכזיות לקריאה. הראשונה, `json.loads` עם האות אס בסוף, מקבלת מחרוזת טקסט שמכילה JSON וממירה אותה לאובייקט פייתון, כמו מילון או רשימה. השנייה, `json.load` בלי האס, מקבלת אובייקט של קובץ פתוח וקוראת ממנו את התוכן ישירות. ההבחנה חשובה: `loads` עובד על מידע בזיכרון, כמו תגובת API, בעוד `load` עובד על מידע ששמור בקובץ על הדיסק.

[מעבר שקף]

[clear]
בדומה לקריאה, יש שתי פונקציות לכתיבה. `json.dumps` עם אס, מקבלת אובייקט פייתון והופכת אותו למחרוזת JSON. `json.dump` בלי אס, מקבלת אובייקט פייתון ואובייקט קובץ, וכותבת את מחרוזת ה-JSON ישירות לקובץ. כאן יש לנו שני פרמטרים סופר-חשובים, במיוחד בהקשר הישראלי. הראשון הוא `indent=4`, שמוסיף הזחות כדי שהפלט יהיה קריא ומסודר. השני, והוא קריטי, הוא `ensure_ascii=False`. ברירת המחדל שלו היא True, מה שהופך עברית לג'יבריש של קודים. כדי לראות עברית תקינה בקובץ הפלט, אנחנו חייבים להגדיר אותו ל-False.

[מעבר שקף]

[calm]
ברגע שהטענו את ה-JSON לאובייקט פייתון, אנחנו כבר לא בעולם ה-JSON, אנחנו בעולם של פייתון. זה אומר שאנחנו עובדים עם מילונים ורשימות רגילים לחלוטין. הגישה לערכים נעשית עם סוגריים מרובעים. אם יש מבנה מקונן, פשוט משרשרים את הגישות. אפשר להוסיף מפתחות חדשים, לעדכן ערכים קיימים, למחוק מפתחות ולעבור על מערכים עם לולאת for רגילה. שימו לב לטעות נפוצה: ניסיון לגשת למפתח שלא קיים יזרוק שגיאה. דרך בטוחה יותר היא להשתמש במתודת `get`, שמאפשרת לספק ערך ברירת מחדל אם המפתח לא נמצא.

[מעבר שקף]

[calm]
עכשיו בואו נעשה משהו מעשי. נדמיין ששלחנו בקשת API למערכת CRM ישראלית כדי לקבל פרטי הזמנה של לקוח. המערכת החזירה לנו תגובת JSON מורכבת. המשימה שלנו היא לטעון את ה-JSON הזה, לחלץ ממנו מידע ספציפי, לבצע חישוב, להוסיף מידע חדש, ולשמור את התוצאה המעודכנת לקובץ. אני אעבור כעת להדגים את התהליך הזה בקוד.

[מעבר שקף]

[calm, confident]
עד עכשיו דיברנו על JSON בתקשורת 'קלאסית' בין מערכות. אבל איפה זה פוגש אותנו, כמהנדסי AI? אחת המשימות הנפוצות ביותר היא לבקש ממודל שפה, LLM, להפיק פלט במבנה מסוים. ברירת המחדל של מודל היא לייצר טקסט חופשי, אבל אם אנחנו רוצים להשתמש בפלט שלו באופן אוטומטי, אנחנו צריכים אותו בפורמט צפוי ומובנה, כלומר JSON. המודלים המתקדמים של היום, כמו GPT-5.4 או Claude Opus 4.7, תומכים בשיטות ש'מאלצות' את המודל להחזיר תשובה שתואמת במדויק סכמת JSON שאנחנו מגדירים לו. זה קריטי כדי להבטיח אמינות ואוטומציה מלאה.

[מעבר שקף]

[calm]
בואו נראה איך זה נראה בקוד. נניח שיש לנו טקסט של מייל מלקוח, ואנחנו רוצים שהמודל יחלץ ממנו פרטים. אנחנו נגדיר למודל, דרך ה-API, את סכמת ה-JSON הרצויה. למשל, ב-API של OpenAI, אפשר להשתמש בפרמטר `response_format` עם הערך `json_object` ובנוסף לספק בפרומפט את המבנה המדויק שאנחנו רוצים. ה-API עצמו יוודא שהטקסט שהמודל מייצר הוא JSON תקין לחלוטין שתואם את הבקשה. התוצאה היא אמינות של כמעט מאה אחוז בקבלת המידע במבנה שאנחנו צריכים.

[מעבר שקף]

[clear]
אז המודל החזיר לנו JSON. מעולה. אבל איך נהיה בטוחים שהוא לא רק תקין תחבירית, אלא גם מכיל את הנתונים והטיפוסים הנכונים? כאן נכנסת לתמונה `Pydantic`, ספריית הוולידציה המובילה בפייתון, והיא סטנדרט דה-פקטו ביישומי AI מודרניים המשתמשים בגרסה שתיים שלה. עם Pydantic, אנחנו מגדירים את 'חוזה הנתונים' שלנו באמצעות קלאס פייתון פשוט. לאחר מכן, אנחנו פשוט 'מאכילים' את הקלאס ב-JSON שקיבלנו. Pydantic תוודא שכל השדות קיימים, תמיר טיפוסים במידת האפשר, ותזרוק שגיאה ברורה אם משהו לא תקין. זה ההבדל בין קוד של אב-טיפוס לקוד production-ready.

[מעבר שקף]

[calm]
לפעמים, עבור פרויקטים קטנים או שמירת קונפיגורציה, אנחנו לא צריכים בסיס נתונים מלא. במקרים כאלה, קובץ JSON יכול לשמש כ'בסיס נתונים' פשוט ויעיל. התהליך פשוט: קוראים את כל הקובץ לזיכרון, מבצעים את השינויים הנדרשים על האובייקט בפייתון, וכותבים את כל האובייקט המעודכן חזרה לקובץ. היתרונות הם פשטות וחוסר צורך בהתקנות. החסרונות הם חוסר יעילות בקבצים גדולים וחוסר התאמה לגישה במקביל. יש להשתמש בשיטה זו בחכמה.

[מעבר שקף]

[clear]
בואו נסכם כמה מהבעיות הנפוצות שתתקלו בהן. ראשית, אם העברית מופיעה כג'יבריש, כנראה שכחתם להוסיף `ensure_ascii=False` בפעולת הכתיבה. שנית, שגיאת `KeyError` אומרת שניסיתם לגשת למפתח שלא קיים; הפתרון הוא להשתמש ב-`.get()`. שגיאה נפוצה אחרת קורית כששוכחים להפעיל `json.loads` על מחרוזת, ומנסים לגשת אליה כאילו היא כבר מילון. לבסוף, `JSONDecodeError` מעידה שהטקסט שניסיתם לפענח אינו JSON תקין. הכרת השגיאות האלה תחסוך לכם שעות של דיבאגינג.

[מעבר שקף]

[clear]
אז מה למדנו היום? למדנו ש-JSON הוא הפורמט הסטנדרטי לתקשורת נתונים בין מערכות. ראינו שספריית `json` של פייתון מספקת כלים פשוטים לקרוא ולכתוב את הפורמט הזה. הדגשנו את צמד הקסם `indent=4` ו-`ensure_ascii=False` כדי לייצר פלט קריא ובעברית. לבסוף, הבנו שבעולם ה-AI, היכולת לכפות על מודלי שפה פלט JSON מובנה היא קריטית, וספריית `Pydantic` היא הכלי המרכזי שלנו לוודא שהפלט הזה אכן תקין ושימושי. השליטה ב-JSON היא יכולת בסיסית והכרחית.

[מעבר שקף]

[warm]
בשיעור הבא, חמש נקודה חמש, ניקח את כל מה שלמדנו עד כה במודול - עבודה עם APIs, קבלת Webhooks ועיבוד JSON - ונתחיל לחבר את כל החלקים יחד כדי לבנות תהליכי אוטומציה פשוטים. זה השלב שבו התיאוריה הופכת לכלי עבודה ממשי. תודה רבה לכולם, ואני זמין כעת לשאלות.