My simple JSON flavor – JavaScriptSerializer at the server and json2.js at the client

12 בדצמבר 2009

11 תגובות

קודם כל, עבור הקורא היחידי שלי, אני מתנצל על העדר הכתיבה בבלוג, אוסף של תירוצים הוביל טיוטות של פוסטים אל ה 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 אז לא תצטרכו לבנות/לפרסס בעצמכם, אבל יש מקרים שבהם זה נדרש, ואני מקווה שיהיה לי זמן לכתוב כמה דוגמאות בנושא.

קידוד נעים.

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *

11 תגובות

  1. Rotem Bloom12 בדצמבר 2009 ב 17:13

    ידוע אבל תמיד נחמד לרענן 🙂
    פוסט מצויין

    הגב
  2. Shlomo12 בדצמבר 2009 ב 20:11

    אני לא חושב שיש לך רק קורא יחיד 🙂

    ותודה על הפוסט ועל הלינק לשימוש בצד הלקוח

    הגב
  3. Avi Pinto12 בדצמבר 2009 ב 22:03

    היי רותם ושלמה, תודה על התגובות 🙂 ונחמד לדעת שיש יותר מקורא אחד :-).
    העניין עלה לאחרונה בכמה שיחות עם החבר'ה, אז החלטתי לכתוב עליו.

    הגב
  4. Rotem Bloom13 בדצמבר 2009 ב 8:25

    ברור שאין לך רק קורא אחד!!!!
    יש לך שניים אני ושלמה
    סתםםםםםםםםםםםםםםםםםםםם 🙂

    הגב
  5. Hila Anina14 בדצמבר 2009 ב 16:32

    פוסט קצר וקולע.
    תודה אבי 🙂

    הגב
  6. חן אגוזי19 בדצמבר 2009 ב 14:46

    אם אתה כבר משתמש ב jQuery אז למה לך להוסיף ספריה נוספת? jQuery יודע לטעון JSON בלי תוספים.

    למשל – http://docs.jquery.com/Ajax/jQuery.getJSON

    או jquery.Ajax שיודע לקבל פרמטר של dataType, ובמידה וערכו "json" אז התשובה תפורסס אוטומטית ואתה תקבל אובייקט JS כשר למהדרין.

    אגב, אם אינני טועה, אז בגירסאות האחרונות של jQuery, אם הסביבה מזהה ש json2.js טעון, אז הוא ישתמש בו מאחורי הקלעים, בלי שצריך לשנון כלום בקוד שלך, מה שיתרום ל compatibility בעתיד.

    הגב
  7. Moshe L20 בדצמבר 2009 ב 15:44

    יש משהו מובנה ב-IE8 ומעלה, אבל באחרים עוד לא

    הגב
  8. Avi Pinto20 בדצמבר 2009 ב 16:53

    הי חן,
    getJSON מבצע בקשת GET ובסופה מפרסס את התוצאה, אני רוצה ממשק נוח לסריול/פרסוס של JSON מתי שאני רוצה(לדוג' – טעינה של אובייקט מסוריל מתוך שדה hidden, עבודה עליו וסריול חזרה כדי שערכו ייקרא ב postback).
    התכוונתי לחפור קצת ולמצוא את הפונקציה המתאימה, אבל קראתי בזמנו (אני חושב שגם כן בפוסט של Rick Strahl )
    שיש בעיות עם הצורה שבה המימוש של jQuery עובד.

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

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

    הגב
  9. Uri Lavi23 בדצמבר 2009 ב 23:37

    פוסט מצויין. יש לך עוד קורא 🙂

    הגב
  10. Avi Pinto27 בדצמבר 2009 ב 8:24

    תודה אורי 🙂

    הגב