JSON

JSON (ראשי תיבות של JavaScript Object Notation) הוא תקן של פורמט קובץ ופורמט העברת מידע שמשתמש בטקסט קריא-לאדם כדי לאחסן ולהעביר מבני מידע המורכבים מזוגות של מפתח-ערך. JSON הוא פורמט נתונים נפוץ עם מגוון שימושים בהעברת מידע, כולל בין השאר העברת מידע בין שרת ללקוח.

פורמט JSON תואר לראשונה על ידי דאגלס קרוקפורד בשנות ה-2000 המוקדמות. הודעת ה-JSON הראשונה נשלחה באפריל 2001<ref></ref>.

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

== היסטוריה ==
אתר האינטרנט [https://www.json.org JSON.org] הושק ב-2002.

בדצמבר 2005 Yahoo! החלה להציע את שירותי הרשת שלה גם בפורמט JSON. שנה לאחר מכן הציעה Google עדכוני JSON עבור פרוטוקול GData.

באוקטובר 2013, Ecma International פרסמו את המהדורה הראשונה של תקן ה-JSON: ECMA-404<ref></ref>. באותה השנה, RFC [https://datatracker.ietf.org/doc/html/rfc7158 7159] אזכר את ECMA-404 כהפניה.

ב-2014, הפך לנוסח התקן הרשמי לשימושי הרשת של JSON.

== דוגמה ==
להלן דוגמה לייצוג של אובייקט המתאר אדם בפורמט JSON.
<syntaxhighlight lang="javascript">
{
 "firstName": "יעקב",
 "lastName": "ישראלי",
 "address": {
 "streetAddress": "רחוב המשעול, 13",
 "city": "ירושלים",
 "state": "ישראל",
 "postalCode": 10021
 },
 "phoneNumbers": [
 "212 555-1234",
 "646 555-4567"
 ]
 }
</syntaxhighlight>

== תחביר ==
=== סוגי נתונים ===
סוגי המידע השונים בJSON הם:

* מספר: מספר חיובי או שלילי שיכול להכיל נקודה עשרונית או כתיב מדעי (כך למשל המספר 0.000037 יכול להיכתב גם כ<code>3.7E-5</code>) אך אינו יכול להכיל דברים שאינם מספרים כמו NaN [אנ]. Javascript משתמשת בסטנדרט IEEE 754 במספר עשרוני בעל דיוק של 64 ביטים (float64) (ומאוחר יותר הוסיפה תמיכה בBigInt)<ref></ref>, אך שפות אחרות שמממשות את JSON יכולות לקודד מספרים אחרת.
* מחרוזת: סדרה של אפס או יותר תווי יוניקוד. מחרוזות תחומות על ידי גרשיים (") ותומכות בלוכסן שמאלי (\) על מנת שהמחרוזת תוכל להכיל את התו גרשיים מבלי להסתיים.
* ערך בוליאני: ערך זה יכול להיות אמת (<code>true</code>) או שקר (<code>false</code>)
* מערך: רשימה ממויינת בעלת אפס או יותר ערכים, כך שכל ערך יכול להיות מכל אחד מסוגי המידע האחרים הנתמכים בפורמט JSON. כך למשל, הרשימה יכולה להכיל מספרים, מחרוזות, אובייקטים וכו'), . על מנת להגדיר מערך נשתמש בסוגריים מרובעים (<code>[]</code>) המקיפים את כל איברי המערך ונשתמש בבפסיק (<code>,</code>) על מנת להפריד איבר לאיבר.
* אובייקט: אוסף של שמות וערכים, בו השמות (הנקראים גם מפתחות) הם מחרוזות. אובייקטים מסומנים בעזרת סוגריים מסולסלים (<code>{}</code>), כאשר בין כל אחד מהזוגות של השמות והערכים מפריד פסיק (<code>,</code>), ובין המפתח והערך שמתאים לו יש נקודתיים (<code>:</code>).
* ערך ריק (<code>null</code>)
מותר לשים מרווחים (Whitespace) בתוך קובץ JSON בין הסימנים המוסכמים (למשל בין ערך אחד במערך לערך הבא) ומי שקורא אותם יכול להתעלם מהם כל עוד הם אינם חלק ממחרוזת. ארבעה תווים נחשבים למרווח בהקשר זה: רווח, טאב, שורה חדשה וחזרה לתחילת השורה (CRLF).

גרסאות מוקדמות של JSON (כמו אלה שהוגדרו בRFC [https://datatracker.ietf.org/doc/html/rfc4627 4627]) הגדירו שJSON תקין יכיל רק אובייקטים ומערכים, שיכולים להכיל את שאר סוגי המידע בתוכם. דרישה זו הוסרה בRFC [https://datatracker.ietf.org/doc/html/rfc7158 7158], שבו טקסט JSON הוגדר מחדש ככל טקסט שמכיל אחד מסוגי המידע שהוגדרו קודם.

המספרים בJSON אדישים לדרך שבה הם מיוצגים בשפות התכנות השונות. למרות שתכונה זו מאפשרת למספרים בעלי דיוק משתנה [אנ] להיות מיוצגים בJSON, היא יכולה להוביל לבעיות בזמן המרת המידע. למשל, אין הבדל בין מספרים שלמים למספרים בעלי נקודה עשרונית, ולכן מימושים שונים יכולים לייצג את <code>42</code>, <code>42.0</code> ו<code>4.2E+1</code> כאותו המספר, בעוד מימושים אחרים יתייחסו אליהם כאל מספרים שונים. הסטנדרט של JSON אינו מגדיר מה לעשות במקרים של גלישת מספר, underflow, איבוד דיוק, עיגול, או במקרה שיש <code>0-</code> אבל הוא ממליץ לא לצפות לדיוק גבוה יותר משהוגדר בIEEE_754 float64 אם רוצים לקבל "המרה טובה" של המידע.

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

JSON לעומת Javascript, אינו מאפשר פסיקים נגררים ("trailing commas"), פסיק שנכתב לאחר הערך האחרון במבנה המידע.<ref></ref>

== JSONP ==
JSONP (ראשי תיבות של JavaScript Object Notation with Padding) הוא שיטה להעברת מסמכי JSON בין אתרים בעלי כתובות אינטרנט שונות. כיוון שמנגנוני אבטחה בדפדפנים מגבילים העברת מסמכים בין אתרים , מסמכי JSON כפי שהם אינם ניתנים להעברה. כדי לאפשר לאתרים אחרים לגשת לאובייקט JSON, המסמך יישמר בפורמט <code>.jsonp</code>, כאשר המידע במסמך נעטף בשם של פונקציית JavaScript הקיימת בדף האינטרנט שממנו טוענים את מסמך ה-JSONP, ובכך מהווה פרמטר של הפונקציה. בעת הטעינה, הפונקציה תופעל, ותוכל לגשת אל אובייקט ה-JSON דרך הפרמטרים שלה. להלן דוגמה למבנה מסמך JSONP:
<syntaxhighlight lang="javascript">
fooBar({
 firstName: "יעקב",
 lastName: "ישראלי",
 address: {
 streetAddress: "רחוב המשעול, 13",
 city: "ירושלים",
 state: "ישראל",
 postalCode: 10021
 },
 phoneNumbers: [
 "212 555-1234",
 "646 555-4567"
 ]
});
</syntaxhighlight>
בדוגמה שלמעלה, <code>fooBar</code> הוא שם הפונקציה שאליה מסמך ה-JSONP יקרא, והמידע המועבר זהה לאובייקט ה-JSON שהוצג בדוגמה הראשונה. דוגמה לפונקציה fooBar:
<syntaxhighlight lang="javascript">
function fooBar(param) {
 alert("שם פרטי: " + param.firstName + ", " + "שם משפחה: " + param.lastName);
}
</syntaxhighlight>
בדוגמה למעלה, בעת טעינת מסמך ה-JSONP, הפונקציה <code>fooBar</code> תציג הודעה עם הטקסט הבא: "שם פרטי: יעקב, שם משפחה: ישראלי".
שם הפונקציה במסמך ה-JSONP יכול להיות סטטי - כלומר, שם פונקציה קבוע שיש לשמור למסמך הספציפי, אך גם אפשרי ליצור שם דינמי לפונקציה, למשל, כאשר לכתובת ה-URL של מסמך ה-JSONP מוסיפים פרמטרים נוספים, בהתאם להוראות האתר שבו נמצא המסמך הרצוי.

==ראו גם==
* XML
* HTML5
* JSON-LD
* Microdata
* RDFa

== קישורים חיצוניים ==

* 
* [http://www.json.org/json-he.html היכרות עם JSON], באתר json.org

== הערות שוליים ==

קטגוריה:שפות סימון
קטגוריה:תקנים בתקשורת מחשבים
קטגוריה:תקני סריאליזציה