
Encodable (אובייקט ל-JSON) ו-Decodable (JSON לאובייקט). אפשר לממש רק צד אחד. הדוגמה: struct בשם Person עם firstName ו-lastName, ומערך people.JSONEncoder מקבל את המערך ומחזיר Data. ממירים אותו למחרוזת ב-UTF-8. עם outputFormatting בערך prettyPrinted מקבלים הדפסה קריאה.JSONDecoder().decode([Person].self, from:).keyDecodingStrategy בוחרים convertFromSnakeCase, והשדה first_name נקרא לתוך firstName.person_h שרוצים לקרוא לו h, ושדה אופציונלי שלא קיים אצל כולם. מגדירים enum בשם CodingKeys עם raw value מסוג String ומקצים לכל מפתח את השם ב-JSON.iso8601, שניות מאז 1970 (secondsSince1970) ו-formatted עם DateFormatter מותאם. בפורמט ISO 8601 יש אות T בין התאריך לשעה ו-Z לאזור UTC. בפורמטר מותאם מגדירים תבנית (year, month, day, שעות, דקות, שניות ו-xx לאזור זמן), ונעזרים בטבלת הסימנים של Unicode.name מקונן עם first_name ו-last_name, ורוצים אותם ישירות ב-Person, מממשים ידנית ב-extension את init(from decoder:). משתמשים ב-container, ב-decodeIfPresent לשדות אופציונליים וב-nestedContainer לשם.encode(to:) עם container(keyedBy:), ויוצרים nestedContainer מסוג var עבור name.dateEncodingStrategy עם הפורמטר, ו-timeZone של הפורמטר ל-UTC כדי שלא יתווסף +2.description.הטקסט המלא של הדקות הראשונות בהרצאה «חיבור ל-API בשרת בפורמט JSON ב-Xcode-Swift - חלק 1» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
שלום וברוכים הבאים בחלקים הבאים של הקורס אנחנו רוצים לעבוד עם מידע שמגיע משרתים מרוחקים שגם קוראים להם APIs והמידע הזה מגיע בצורת JSON אז לפני שנמשיך אנחנו רוצים בכלל לראות מה זה APIs ומה זה JSON אז בואו נעיף מבט נקפוץ רגע לדפדפן ובואו נחפש יש אתר מאוד נחמד שנקרא Rapid API
שהוא דרך אגב סטארט-אפ של בחור ישראלי בן 19 שככה הושקיעו בו די הרבה כספים על ידי כל מיני חברות בינלאומיות ומה שהאתר הזה בעצם עושה הוא מרכז את כל ה-APIs במקום אחד, ככה שקל לראות מה זה API פה ולמה אנחנו צריכים את זה.
API הוא בעצם שירות לאפליקציות, זה שרת שנותן שירות לאפליקציות, מידע לאפליקציות, וככה למשל אתם יכולים למצוא מידע על ספורט, מידע על חדשות, מידע על כל דבר שאתם רוצים באינטרנט, אוקיי? נניח אם אתם רוצים לשלב באפליקציה שלכם מידע על משחקי ספורט, או אם אתם רוצים לשלב באפליקציה שלכם חדשות, שירותים של שליחת
אס.אם.אסים וכן הלאה וזיהוי פנים, מזג אוויר, טקסט אנליסיס, כל מיני שירותים נוספים חיצוניים. אתם תרצו לעבוד עם איזשהו API בשביל זה. עכשיו ה-API ייתן לכם ג'ייסון בסופו של דבר, אוקיי?
אז בוא נסתכל על איזשהו API לדוגמה שנותן ג'ייסון, בוא נעיף מבט נגיד ב-Google Places API. Google Places API פשוט נותן מידע על Places, אוקיי?
עכשיו הקריאה לעבודה עם הדבר הזה זה שרת מרוחק, אז אנחנו נפנה לכתובת הזאת, כתובת אינטרנט, ואנחנו נקבל ממנה תשובה. אז IPI נותן לי פשוט תשובה בפורמט, לרוב JSON, יכול להיות גם פורמט של XML.
אנחנו שולחים אליו בקשות אינטרנט, בקשות HTTP, ואז אנחנו מקבלים את ה-Response שיכולה להיות או JSON או XML במקרה של Google Places, ובואו נסתכל רגע על התשובה.
התשובה בפורמט של JSON היא כזאת. JSON זה בעצם דרך לייצג אובייקטים בפורמט בינלאומי, זה פורמט לייצוג אובייקטים. וסריאליזציה של אובייקטים משפת תכנות כלשהי ל-JSON.
וכמו שאתם יכולים לראות זה פורמט מאוד קריא, יש לנו פה בעצם מערך כזה של Candy Dates ובפנים יש פה מיקומים של המקומות האלה בסדר, או לוקיישן וכן הלאה.
עכשיו כמובן שאפשר לחפש כל מיני דברים ב-API ולקבל כל מיני תשובות ופה אנחנו מקבלים עוד מידע על מקומות, למשל מיקום, אייקון, תמונות, שעות פתיחה וכן הלאה.
אנחנו רוצים ללמוד לעבוד עם ג'ייסון בסוויפט אוקיי ולמה אנחנו רוצים לעבוד עם ג'ייסון בסוויפט כדי שבהמשך המודול נוכל ללמוד לעבוד גם עם APIs. בסוויפט כדי לעבוד עם ג'ייסון אנחנו נשתמש בפרוטוקול שנקרא קודאבל בוא נעיף עליו מבט ראשוני ואחר כך נצלול יותר לעומק אנחנו נרשום בגוגל קודאבל סוויפט כדי להגיע לדוקומנטציה ואנחנו ניכנס לאפל developer כדי
לראות את הדוקומנטציה הזאת בסופו של דבר קודאבל לפי מה שכתוב פה זה פרוטוקול שמורכב משתי חלקים, Decodable ו-Encodable.
עכשיו יש תהליך של בעצם סיריאליזציה ודה-סיריאליזציה ולכן יש פה שתי חלקים לפרוטוקול. בואו נסתכל ב-First Steps, צעדים ראשונים, איך לעבוד עם האובייקטים שלנו ולהפוך אותם ל-JSON ומי-JSON.
אז נסתכל בדוקומנטציה כדי לקבל איזשהו Overview וכאן אומרים לנו בעצם את מה שאנחנו כבר יודעים, נכון? הרבה משימות בתכנות דורשות להביא מידע מהאינטרנט ולשמור את המידע בחזרה ל-APIs ושירותים כאלה כמו שראינו קודם.
אז זאת הסיבה שאנחנו רוצים ללמוד ג'ייסון. עכשיו, איך זה עובד? יש לנו נגיד איזשהו Data Tracture בסוויפט, ואם אנחנו רוצים לעבוד איתו עם ג'ייסון, לקבל ג'ייסון ולהפוך אותו ללנדמרק ולהפך, אנחנו נרצה לממש את הפרוטוקול קודאבל, ואז נוכל פשוט לעבוד איתו עם ג'ייסון.
יש פה המשכים, הדוקומנטציה עשירה ומלאה, אנחנו נעבור על כל מיני דברים שכתובים פה, על כל הדברים שכתובים פה, אבל מה שמנסים להגיד לי בכמה שקפים הראשונים זה שיש את הפרוטוקול קודאבל ואנחנו נרצה לממש אותו, ובנוסף שאפשר לחלק את קודאבל לשתי חלקים, בסדר? נגיד רק לעשות אנקודינג או רק לעשות די-קודינג ואנחנו נסתכל על זה ביחד.
טוב, אז בואו נקפוץ רגע לסוויף ונעשה איזשהו פרויקט כדי להתחיל לקבל את המידע. אני אייצר פלייגראונד הפעם ובואו נעשה פלייגראונד ריק בלאנק נגדיל את זה כדי שנוכל לראות את זה ככה בצורה מוצלחת ונקרא לפלייגראונד שלנו json.playground
אוקיי טוב אז בואו נתחיל באיזשהו סטראקט די פשוט נגיד יש לנו סטראקט של פרסון עכשיו הפרסון שלנו יהיה מורכב מפרסט ניים ולאסט ניים ובואו נעצור פה ועכשיו אנחנו החלטנו שאנחנו רוצים לדעת להמיר את המופעים של הסטראקט הזה לג'ייסון ומי ג'ייסון.
אז כדי לעשות את זה בואו נייצר לעצמנו מערך people וזה בעצם יהיה מערך של פרסונים אז בואו נכניס פה כמה פרסונים פנימה בואו נגיד שאנחנו רוצים איזה כמה שמות פה אז בעצם יצרתי בינתיים מופע נכון פשוט מופע בתוך מערך מאוד מאוד פשוט בואו נדביק את זה כמה פעמים אוקיי ונשנה פה
קצת את השמות כדי שנוכל לראות איך זה נראה באופן כללי ככה על ההתחלה אפשר פשוט שפרסון יהיה קודאבל. קודאבל פירושו גם Decodable וגם Encodable, בסדר?
עכשיו, בגלל שזה פרוטוקול שהוא צירוף של פרוטוקולים, הייתי יכול לממש רק Decodable או רק Encodable.
אבל אנחנו רוצים את שתי הכיוונים, בסדר? גם סריאליזציה וגם דה-סריאליזציה, גם ל-JSON וגם מי-JSON. אז עכשיו אנחנו רוצים לקחת את המערך הזה ולייצר ממנו JSON.
איך אנחנו מייצרים JSON? convert objects to JSON. אז איך אנחנו מייצרים ג'ייסון? מאוד פשוט, יש לנו אובייקט שנקרא ג'ייסון סליחה יש לנו אובייקט שנקרא ג'ייסון אנקודר והוא יודע לעשות אנקודינג אוקיי?
עכשיו האנקודר שלנו אנחנו פשוט ניתן לו את המערך והוא בהינתן זה שהוא קודאבל האובייקט אז אין לו שום בעיה לעבוד איתו והוא יהפוך אותנו לג'ייסון דאטה. אז בוא נגיד let json data שווה ואנחנו נבקש מהאנקודר שלנו אבל המתודה הזאת זורקת שגיאה אז בואו כבר מיד נעשה טריי.
אני אעשה טריי ככה, פורס טריי, כי אנחנו יודעים בוודאות שזה יצליח, ואני אגיד לאנקודר שלי לעשות אנקוד לפיפל, אוקיי? עכשיו, מה אנחנו מקבלים כאן?
דאטה, אוקיי? דאטה זה מידע בינארי. אם אתם רוצים לראות את זה כסטרינג, אז בואו נמיר את זה לסטרינג, let jsonString שווה לסטרינג חדש מדאטה, ואני אתן לו את ה-JsonData שיש לנו עכשיו, וגם אנחנו רוצים להגיד לו שה-Encoding הוא UTF-8.
אוקיי, אז זה ה-String של ה-Json, אפשר להדפיס אותו ולראות אם הצלחנו לקבל ג'ייסון סטרינג. זה אופציונל, אז בואו נעשה פה סימן קריאה גם כן, כי אנחנו שוב פעם יודעים בוודאות שזה הולך להצליח, ונריץ את הפלייגראונד.
יפה, אז הנה התוצאה פה. כמו שאתם רואים, ההדפסה היא לא משהו, והיינו רוצים שהג'ייסון שלנו יהיה יותר יפה קצת, נכון? שירד שורות וכן הלאה.
יש אופציה כזאת גם כן בג'ייסון אנקודר לבקש ממנו שיודפיס לנו יפה. אז encoder.format וכאן אנחנו רוצים להגיד שאנחנו רוצים pretty printed format כלומר שיתפיס לי את ה-JSON בצורה יפה נריץ את זה שוב פעם והנה יש לנו פה למטה את ה-JSON בפורמט נחמד ונעים אוקיי בסדר זה הצעד הראשון נכון אנחנו ככה מקבלים את זה בתור צעד ראשון עכשיו
נניח שקיבלתם JSON מהאינטרנט אוקיי בואו נשים רגע את כל אלה בהערה כדי לא להעמיס על עצמנו יותר מדי ונניח שקיבלתי את ה-JSON הבא לג'ייסון מהאינטרנט עכשיו אני אלך פה על סטרינג עם שלוש מירכאות שמה שזה אומר זה מולטיליין סטרינג ואז אני יכול פשוט להדביק פה את הג'ייסון שקיבלתי פה בקונסול אוקיי ופשוט זה מאפשר
לי לשמור על כל הפורמט שהיה קודם בצורה נחמדה ונעימה ולכן הלכתי פה על מולטיליין סטרינג אוקיי אז יש לי סטרינג ואנחנו עכשיו רוצים לקבל ממנו מערך אוקיי סריאליזציה ודה סריאליזציה אז אם אנחנו רוצים להפוך את זה למערך קודם כל אנחנו צריכים דאטה data מסטרינג זה לא בעיה יש לנו פשוט let json
data שווה לסטרינג שיש לי נקודה data הוא פשוט שואל אותי באיזה נקודינג אז בוא נגיד utf-80 יפה אז הנה יש לי דעית כבר ועכשיו איך אני לוקח מזה מערך אז אנחנו צריכים לעבוד עם json decoder אני אקרא לזה פשוט decoder ועל הדקודר שלי אני רוצה פשוט לבקש ממנו שייתן לנו מערך של people
אז זאת מתודה שזורקת שגיאה, אז בואו נעשה את ראי כמו קודם, ו-decoder.decode, ואני אגיד לו איזה טייפ אני מצפה לקבל, אני מצפה לקבל מערך של פרסון, אז בואו נגיד מערך של פרסון, וכדי להגיד לו את הטייפ אני צריך להגיד .self, שזה מה שמחזיר לי את המערך .type, יפה, הוא רוצה ממני את הדאטה,
אז זה הדאטה הזה, נכון? עכשיו בואו ניתן לו את ה-JSON data, שהוא אופציונל והוא לא רוצה אופציונל, אז נעשה פה סימן קריאה, כמובן שלמדנו לעבוד עם אופציונלס אז אתם יודעים מה האפשרויות שלכם כאן. בואו נעשה פרינט לפיפל ונראה אם הצלחנו באמת לקרוא את המידע כמו שצריך מהג'ייסון שקיבלנו.
אוקיי כן כאן אתם יכולים לראות ככה את התחילית פה שזה כרוך בזה שאנחנו לא מימשנו את הדסקריפשן נכון? הדסקריפשן הוא דסקריפשן אוטומטי ולכן קיבלנו פה דסקריפשן קצת מוזר אבל כן הדסריאליזציה פה עבדה ועבדה יפה.
זה הבסיס יש לכם ג'ייסון ואתם מייצרים פשוט סטרקצ'ר שהוא קודאבל וקודאבל זה אפשר גם לעשות די קודאבל וגם אנקורדאבל אם למשל פרסון היה רק די קודאבל אז הייתי יכול לעבוד רק עם הצד הזה אוקיי ואם הוא היה רק אנקורדאבל אז הייתי יכול רק להפוך אותו לג'ייסון די קודאבל אז אני יכול מג'ייסון לקבל לקרוא אובייקטים ואנקורדאבל אני יכול להפך אז זה העיקרון
הבסיסי אבל יש לזה הרבה התפתחויות ואנחנו רוצים ללמוד אותן. הרבה פעמים ב-JSON אנחנו מקבלים שמות שלא מתאימים לנו מבחינת Swift. בואו אני אראה לכם דוגמה כזאת ב-Rapid API, יש פה מזג אוויר API, בסדר? weatherbit.io נותן את המידע שלו בצורה הבאה.
אנחנו מקבלים wind_directionstatecode עם underscore city name אלה שמות שהם נהוגים בעולם ה-Web אבל הם לא מתאימים ב-Swift, נכון? מוסכמות לגבי שמות ב-Swift זה ללכת על camelcase ואז אנחנו נרצה לרשום ווינד ובדיר אנחנו נרצה לרשום את זה בדי גדולה אז איך אנחנו יכולים להתמודד עם ג'ייסון כזה בואו ניקח את הדוגמה הזאת בפרסט ניים שלנו
אנחנו פשוט נעשה פרסט אנדרס קור ניים לאסט אנדרס קור ניים וננסה להתמודד עם זה אוקיי רק בואו נסדר שכל הג'ייסון יהיה אחיד כי ג'ייסון למרות שהוא מגיע בפורמט שאתם לא אוהבים הוא תמיד אחיד אוקיי אז הנה הג'ייסון שקיבלנו ואנחנו רוצים להמיר אותו לסטרקט שלנו בסוויפט אנחנו לא רוצים להתפשר
אופציה אחת זה להתפשר ולקרוא לזה first underscore name ואז זה יעבוד כרגיל אין לי מה להוסיף אבל אם אתם לא רוצים להתפשר ואתם בכל זאת רוצים לקחת את הג'ייסון הזה ולהמיר אותו לאובייקטים שלכם מה שאתם תצטרכו לעשות זה במקרה שלנו פשוט להגיד לדקודר לעשות עבורנו את התרגום אז יש לנו פה את הכי
קודינג סטרטג'י ופה אנחנו יכולים להגיד לו שימיר הכל מסנייק קייס שזה נקרא סנייק קייס עם אנדרסקורים והוא ימיר לנו את זה כמובן לקאמל קייס אז איזה נחמד נכון בוא נבדוק שזה עדיין עובד אני אריץ את הפלייגראונד יפה אז הוא הצליח להתמודד פה מסניי קייס לקאמל קייס שורה אחת של תיקון קטן ובזה סיימנו אבל מה קורה אם אתם מקבלים איזשהו שדה שאתם לא אוהבים את
השם שלו בכלל אוקיי למשל הוסיפו לנו בג'ייסון שדה שנקרא person h אוקיי עכשיו בוא נגיד שזה יהיה 20 שמתי פה מספר אוקיי עכשיו צריך לבוא פה פסיק בגלל איך שהפורמט של ג'ייסון מוגדר.
בואו נשים את זה רק בשתיים מהפרסונים ולא בשלישי, שזה יהיה מעניין בכל זאת. אז בוא נשים פה נגיד, זה בן 20, זה בן 30, ופה זה לא מוגדר בכלל.
אם ככה, אנחנו נגדיר את h כאופציונל. הוא יהיה נגיד מספר אבל אופציונל, וזה גם מותר לנו לעשות.