PracticU

דוגמאות לעבודה עם JSON - חלק 2

בלי כתוביותעם כתוביות
PracticU › קורס פיתוח אפליקציות - לאייפון iPhone iOS - ב-Swift-Xcode › דוגמאות לעבודה עם JSON - חלק 2
מילון מושגים:
JSON - פורמט טקסט קריא לייצוג נתונים מובְנים כזוגות מפתח-ערך, נפוץ להחלפת מידע בין שרת ללקוח.
API - ממשק תכנותי שמגדיר כיצד תוכנה אחת פונה לאחרת ומחליפה איתה נתונים ופעולות.
מודל - רכיב שמייצג את הנתונים ואת הלוגיקה העסקית באפליקציה. גם ייצוג מופשט של מערכת או תהליך.
מערך - מבנה נתונים שמאחסן אוסף ערכים מאותו סוג ברצף, שאפשר לגשת אליהם לפי מספר מיקום (אינדקס).
מחרוזת - סוג נתונים שמייצג רצף של תווים, כלומר טקסט, ומשמש לאחסון מילים, משפטים או כל רצף סימנים.
אובייקט - יחידה בתכנות מונחה עצמים שמאגדת נתונים (תכונות) ופעולות (מתודות). נוצר בדרך כלל ממחלקה המשמשת כתבנית.
תמונה - קובץ גרפי המוצג על המסך. בהקשר של וירטואליזציה או Docker, תבנית מוכנה שממנה יוצרים מכונה או קונטיינר.

דוגמאות לעבודה עם JSON - חלק 2
הדוגמה בשיעור היא JSON של Google Places API, שבנוי בשכבות מקוננות שלא נוחות ב-Swift. מראים איך לשטח אותו למודל פשוט עם פענוח ידני.
השלבים העיקריים
1. מקור הנתונים: מעתיקים את דוגמת התשובה מתיעוד ה-API (Place Search) לקובץ mock_data.json בפרויקט חדש, וגוררים אותו לפרויקט עם אפשרות ההעתקה.
2. תכנון המודל: Place מכיל latitude ו-longitude (Double) ישירות במקום ב-geometry ו-location, icon, id, name, placeID, types (מערך של String) ו-vicinity. השדה openNow הוא Bool אופציונלי במקום קונטיינר opening_hours, ו-photo הוא אובייקט אחד במקום מערך, כי במערך תמיד יש תמונה אחת.
3. struct פנימי: Photo עם height, width ו-ref. ה-enum CodingKeys ממפה את ref לשם photo_reference ב-JSON.
4. עטיפת התוצאות: struct בשם Places עם מערך places, שהמפתח שלו ב-JSON הוא results.
5. מימוש Decodable ב-extension: מגדירים CodingKeys שכוללים גם את המפתחות של geometry, location, opening_hours, open_now, place_id, lat ו-lng, ואז כותבים init(from:).
6. שדות פשוטים: icon, id, name, placeID, types, vicinity נשלפים ישירות מה-container. את התמונה לוקחים מאיבר 0 של מערך photos.
7. נתון שלא תמיד קיים: opening_hours חסר בחלק מהמקומות, ולכן מנסים לקבל את ה-nested container עם try? ואת open_now בהמשך, עם try? גם כן. כשהקונטיינר חסר, הערך נשאר nil.
8. קונטיינרים מקוננים: מ-geometry ל-location ורק אז lat ו-lng, באמצעות nestedContainer פעמיים.
9. פענוח: פונקציית readPlaces קוראת את הקובץ, ו-JSONDecoder מפענח ל-Places. ההדגמה משתמשת ב-try! כדי לראות איפה הקוד נופל.
שימו לב
בהרצה הראשונה התקבלה שגיאה, key not found עבור longitude: ב-JSON הוא נקרא lng. תיקון ה-CodingKeys פתר את זה. בדיקת JSON אמיתי מול המודל חשפה את הטעות.
בסוף האפשר להמיר JSON מקונן של Google Places למודל שטוח וקריא ב-Swift.
השיעור הבא בקורס: דוגמאות לעבודה עם JSON - חלק 3

פרקי ההרצאה: דוגמאות לעבודה עם JSON - חלק 2

  1. 00:00

    דוגמת ה-JSON של Google Places

  2. 00:41

    שמירת ה-JSON כקובץ מקומי

  3. 01:17

    פרויקט חדש וקובץ Place

  4. 02:26

    מודל שטוח במקום קונטיינרים מקוננים

  5. 03:20

    הגדרת התכונות של Place

  6. 05:21

    struct של Photo עם CodingKeys

  7. 06:40

    struct של Places למערך התוצאות

  8. 07:45

    extension ל-Place עם Decodable

תמלול ההרצאה: דוגמאות לעבודה עם JSON - חלק 2

הטקסט המלא של הדקות הראשונות בהרצאה «דוגמאות לעבודה עם JSON - חלק 2» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

    שלום וברוכים הבאים אנחנו רוצים להמשיך בדוגמאות ופתרון של מקרים בעבודה עם ג'ייסון בפרוטוקול קודאבל אז בואו ניכנס רגע לגוגל ונמצא את הג'ייסון של גוגל פלייסס איך שהוא נראה וננסה להתמודד איתו בסוויפט אז אנחנו כותבים בגוגל גוגל פלייסס API וכאן אנחנו ניכנס ל-overview

  2. 00:23

    ותחת פלייס סרצ' אנחנו נסתכל על איזושהי דוגמה של ג'ייסון שהם נותנים וננסה לפענח אותה אז אנחנו נרד פה למטה ונראה איך נראה התוצאה של העבודה עם ה-API הזה.

  3. 00:39

    והנה יש לנו פה רספונסס, כאן יש רספונס יותר פשוט ומתחת יש איזשהו רספונס ככה יותר מעניין. אז בואו נעתיק את ה-JSON הזה, בסדר?

  4. 00:49

    זה ה-JSON שאנחנו רוצים להעתיק. כרגע אנחנו עדיין עובדים עם קבצים מקומיים, אז בואו נקפוץ ל-Finder ופשוט נשמור את הדבר הזה כקובץ מקומי קודם כל.

  5. 01:00

    אז ב-Finder יש לי פה את הקובץ הזה מוק דאטה JSON מהשיעור הקודם, יכול בעצם להעתיק אותו או פשוט לעבוד עליו בוא נלחץ פה נערוך אותו נעשה command a נמחק הכל ונדביק את הג'ייסון שזה עתה קיבלנו ואני אשמור את זה טוב דרך אגב המוק דאטה שיש בפרויקט הקודם עדיין נשמר בפרויקט הקודם זה פשוט תקיע דאונלודס ועשינו קופי לפרויקט טוב עכשיו בוא

  6. 01:26

    נפתח את אקסקוד ונייצר לנו פרויקט חדש אז create new xcode project ובואו נקרא לזה json demo places אנחנו מתרגלים עדיין עבודה עם json אז בואו נעשה next ואנחנו מייצרים את זה בתיקייה הרגילה שלנו מצוין עכשיו כמו בשיעור הקודם אנחנו רוצים לגרור את הקובץ הזה של המוק דאטה נגיד פה מתחת לview controller ולהעתיק

  7. 01:53

    אותו לפרויקט ולדאוג שהוא יעבור קומפילציה עם הפרויקט וכך הלאה ובואו נפתח פה את xcode במסך שלם ואנחנו רוצים לייצר לעצמנו קובץ חדש קובץ החדש בשביל לעשות סיריאליזציה ודה סיריאליזציה האובייקטים האלה של ה-places אנחנו נקרא לו place אז new swift file בואו נקרא לזה place.swift אנחנו נרצה פה לעבוד עם foundation זה מספיק

  8. 02:26

    טוב אנחנו נרצה structure place שיתאים למה שכתוב פה ב-json בסדר עכשיו אם אתם מסתכלים פה על ה-json אז המידע פה הוא הרבה פעמים בתוך קונטיינרים מיותרים מבחינתנו זאת אומרת יש פה את ה-result בפנים יש geometry בפנים יש location ואז יש את ה-latitude longitude

  9. 02:44

    מבחינתי ב-place יכול להיות ישר ה-latitude longitude באותו אופן יש לנו פה עוד פעם נסטד קונטיינר של ה-Opening Hours ובסך הכל אנחנו נרצה תכונה של Open Now True or False.

  10. 02:54

    לגבי פוטוס יש פה מערך של תמונות, של אובייקטים. עכשיו בעוד מתאים לי שיהיה לי אובייקט לפוטו אחד, המערך הזה תמיד מכיל איבר אחד, אז אם אנחנו רואים שבכל הפעמים במערך יש תמונה אחת, אז בואו פשוט נשמור תמונה אחת.

  11. 03:11

    טוב, אז איך אנחנו ממדלים את זה? עושים לזה מודל בעצם בפלייסט נקודה סוויפט. בואו נייצר פה סטראקט קודם כל של פלייס ובסטראקט הזה בואו נבחר את התכונות שאנחנו רוצים אני ארצה שיהיה לי את הלטיטוד ולונגיטוד מיד כתכונה אז let lat מסוג של דאבל ואותו דבר לגבי לונגיטוד למקרה

  12. 03:38

    שאתם לא יודעים אז הלונגיטוד סליחה let longitude למקרה שאתם לא מכירים אז latitude ולונגיטוד זה נקודות ציון אורך רוחב בסדר זה פשוט מספרים כאלה של המיקום עצמו עכשיו מעבר לlatitude longitude בוא ניקח אייקון ID, name וכן הלאה, אז נחזור חזרה ונוסיף לעצמנו את אייקון שיהיה סטרינג, את ה-ID כסטרינג, את

  13. 04:08

    ה-Name של המקום כסטרינג. עכשיו במקום הקונטיינר של open in hours, בואו פשוט נעשה open now והוא יהיה פשוט בוליאנינג.

  14. 04:22

    אנחנו נרצה אובייקט אחד של פוטו ובשביל זה אנחנו נצטרך לייצר סטראקט, אז עוד מעט נעשה את זה, כרגע פשוט נרשום את זה ככה, ותכף נעשה גם סטראק של פוטו כדי שהקומפיילר יהיה מרוצה ועוד מעט נעבוד עליו.

  15. 04:37

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

  16. 05:08

    Opening Hours, אחר כך יש לנו Place ID, פה יש איזשהו רפרנס שלא לקחתי אותו בחשבון, אפשר כמובן להוסיף אותו אם אתם רוצים. הטייפס זה מערך, ו-Vicinity זה סטרינג.

  17. 05:19

    אז לקחתי את כל התכונות הבסיסיות, אבל בקשר ללטיטוד ולונגיטוד החלטתי לכלות אותם כתכונות פשוטות יותר, במקום לעשות נסטד סטרקצ'רס מיותרים מבחינתנו בפרויקט.

  18. 05:30

    ולגבי הפוטו, בואו נעבוד על הסטרקצ' של הפוטו עכשיו, ונוסיף לו את התכונות של ההייט, וויטף, ואפשר גם לקחת את הפוטו רפרנס, נקרא לו פשוט רף.

  19. 05:40

    אז פוטו, יהיה לנו הייט, רגע, יהיה לנו הייט שזה יהיה מספר שלם, יהיה לנו וויד שזה יהיה מספר שלם, ויהיה לנו את הפוטו רף שהוא יהיה סטרינג.

  20. 05:58

    עכשיו, כדי לממש את הפרוטוקול של קודאבל או דיקודאבל, בואו נגיד שאנחנו רוצים רק דיקודאבל, אנחנו פשוט רוצים להיות מסוגלים לקרוא את הג'ייסון מהם, אז כדי לממש פה את הפרוטוקול, הרף זו מילה ששינינו, נכון?

  21. 06:10

    בג'ייסון היה כתוב פוטו רף, אז בואו נעשה אינאם של קודינג קייס כדי לעמוד על השינוי הזה. האינאם הזה יש לו raw value של string כמו שאתם זוכרים והוא מיומש את הפרוטוקול של קודינג קי.

  22. 06:24

    ובקייסס בואו נגיד שיש לנו את height בלי שינוי יש לנו את width בלי שינוי ויש לנו את הרף שבג'ייסון קוראים לזה photo underscore reference.

  23. 06:38

    לגבי ה-height אנחנו צריכים להיות עקביים אז height זה height ובזה מימשנו בפוטו לפחות את decodable כי זה נורא פשוט. עכשיו במערך ב-json result בעצם יש לנו מערך אז אז בואו נעשה עוד סטראקט של places של ה-result אז places ופה פשוט יהיה לנו מערך של place והם קוראים לזה שם אצלם מבחינת coding keys

  24. 07:05

    אז בואו ניצר אצלנו coding keys שזה enum שיש לו raw value של סטרינג וממש את הפרוטוקול coding key הם קוראים ל-places אצלם result אוקיי אז let places שווה ופה אנחנו נרשום results מאיפה זה בא זה בא מפה נכון כאן יש לי results ואני לא רוצה לקרוא לזה לזלזל צריך לקרוא לזה places בסוויפט אוקיי אז יש לנו את האפשרות עם הקודינג קיז לתקן פה את השמות ועכשיו אנחנו יכולים להגיד

  25. 07:36

    עדיין לא אנחנו נרצה להגיד אבל שplaces הוא דיקודאבל אז בואו נגיד את זה עכשיו למה זה לא יכול להתקיים בגלל שplace עצמו הוא לא דיקודאבל נכון אז בואו נעשה את האימפלמנטציה שלנו של דיקודאבל לפלייס בוא נעשה extension לפלייס שכאן נמצאת כל העבודה כדי לממש יש את הפרוטוקול Decodable ואנחנו רוצים לעשות את הדבר הזה בעצמנו בעצם,

  26. 08:07

    למה? בגלל שהג'ייסון לא דומה בכלל למה שהגדרנו, אנחנו החלטנו לשטח חלק מהדברים באובייקט,

לקורס המלא: קורס פיתוח אפליקציות לאייפון

ההרצאה הקודמת: דוגמאות לעבודה עם JSON - חלק 1

ההרצאה הבאה: דוגמאות לעבודה עם JSON - חלק 3

הרצאות קשורות מקורסים אחרים

  • JSON
  • מה זה JSON
  • דוגמאות לסקריפט שימושי
  • דוגמאות לשימוש ב-SIEM - חלק 1

קורסים נוספים במסלול

  • קורס יסודות התכנות - שפת JAVA - קורס ג'אווה למתחילים
  • קורס פיתוח אפליקציות - לאנדרואיד - Android - ב-JAVA
  • קורס פלאטר - Flutter - שפת DART של גוגל למובייל - פיתוח אפליקציות לאנדרואיד ואייפון
  • קורס PhoneGap - פיתוח אפליקציות לאנדרואיד ואייפון