כמו בכל שנה, גם השנה בשני סופי השבוע האחרונים של השנה - מבצע בארטא - כמעט על כל המוצרים ניתנת הנחה של 1+1.
פרטים נוספים בפוסט שלי משנה שעברה.
אמנם פספסתי את שבוע שעבר,
וקרוב לוודאי שלא אוכל להגיע השנה(כל מיני אילוצים שגם עכבו את הפוסט הזה), אבל ממש ממליץ לכם להגיע,
כי אומנות יש לא רק בקוד.
קודם כל, עבור הקורא היחידי שלי, אני מתנצל על העדר הכתיבה בבלוג, אוסף של תירוצים הוביל טיוטות של פוסטים אל ה GMAIL שלי ואני מקווה שייצאו בקרוב.
עכשיו לעניין הפוסט, זהו אמנם לא סיפור חדש בכלל, אבל אולי יחדש למישהו משהו.
אין שום סיבה לבנות/לפרסס מחרוזת JSON בעצמנו,
בצד השרת:
קיימות כבר זמן רב ספריות מוכנות חיצוניות כמו JSON.net by Newton או זו של Ajax Pro
ושתיים שמגיעות עם ה framework:
JavaScriptSerializer
DataContractJsonSerializer
תוך כדי כתיבת שורות אלו, מצאתי את הפוסט המצויין של Rick Strahl מאוגוסט 2008, JSON Serializers in .NET - not there yet,
בו הוא מסביר מדוע כתב ספריה משלו לפרסוס JSON, מראה את ההבדלים בין שתי המחלקות + יתרונות וחסרונות, שהובילו אותו לכתיבת ספריה משלו.
בזמנו, כשעלה הצורך, חסרון מרכזי של DataContractJsonSerializer היה שלא ניתן לסרייל באמצעותו טיפוסים אנונימיים (שימושי מאוד, אם מעוניינים להעביר מידע אל JS),
ובנוסף ה API שלו דיי מגעיל.
ובאותו זמן, כפי שציין Rick, המחלקה JavaScriptSerializer (שכן יודעת לסרייל טיפוסים אנונימיים) הוכרזה כ deprecated ע"י מייקרוסופט,
לא רציתי להשתמש בקוד שיותר לא יתוחזק (מסיבה זו גם נטשתי את הספריה המצויינת Ajax Pro ),
לכן השתמשתי בספריה של Newton (שעובדת מצויין).
עבר קצת זמן מאז ועם יציאת ASP.NET MVC מיקרוסופט החזירו לחיים את JavaScriptSerializer, לכן,למרות שהוא לא מושלם(חסרונות בפוסט של Rick),
הוא מספיק טוב בשבילי, וחוסך לי התעסקות עם עוד dll חיצוני, בסה"כ צריך להוסיף reference ל System.Web.Extensions
עטפתי את הקריאות ל JavaScriptSerializer בשתי פונקציות סטאטיות פשוטות משלי עבור היום שבו הוא אולי לא יספק אותי יותר(עדיין לא קרה).
using System.Web.Script.Serialization;
public class JsonSerializer
{
/// <summary>
/// uses the old JavaScriptSerializer (which is no longer deprecated)
/// the beauty is it can Serialize annonymous types
/// </summary>
public static string Serialize(object Contents)
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
string ret = serializer.Serialize(Contents);
return ret;
}
public static T Deserialize<T>(string input)
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
T ret = serializer.Deserialize<T>(input);
return ret;
}
}
בצד הלקוח:
גם כאן קיימים פתרונות כבר זמן רב,
הפתרון הנאיבי הרע!!! הוא שימוש ב eval על המחרוזת שמתקבלת, זהו פתרון רע כיוון שאם יש סקריפט מרושע בתוך המחרוזת, הסקריפט יופעל.
אני משתמש ב http://json.org/js.html הוא לא מרחיב את ה prototype ולכן לא מתנגש עם jQuery לינק ישיר להורדת הסקריפט: http://json.org/json2.js ויש גם גרסא מכווצת שלו ששוקלת פחות מ 2.5.
דוגמת שימוש(עוד דוגמאות בתיעוד):
//turn js object to a string to send to server
var myJSONText = JSON.stringify(myObject, replacer);
//parse result from ajax call - i don't usually use the reviver
var myObject = JSON.parse(myJSONtext, reviver);
אם אתם שולחים בקשות עם content type מסוג JSON אל service שיודע לקבל JSON אז לא תצטרכו לבנות/לפרסס בעצמכם, אבל יש מקרים שבהם זה נדרש, ואני מקווה שיהיה לי זמן לכתוב כמה דוגמאות בנושא.
קידוד נעים.