**JSON** (ראשי תיבות של **J**ava**S**cript **O**bject **N**otation) הוא תקן של פורמט קובץ ופורמט העברת מידע שמשתמש בטקסט קריא-לאדם כדי לאחסן ולהעביר מבני מידע המורכבים מזוגות של מפתח-ערך. JSON הוא פורמט נתונים נפוץ עם מגוון שימושים בהעברת מידע, כולל בין השאר העברת מידע בין שרת ללקוח.

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

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

היסטוריה
--------

אתר האינטרנט JSON.org הושק ב-2002.

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

באוקטובר 2013, Ecma International פרסמו את המהדורה הראשונה של תקן ה-JSON: ECMA-404. באותה השנה, RFC 7159 אזכר את ECMA-404 כהפניה.

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

דוגמה
-----

להלן דוגמה לייצוג של אובייקט המתאר אדם בפורמט JSON.

```
{
 "firstName": "יעקב",
 "lastName": "ישראלי",
 "address": {
 "streetAddress": "רחוב המשעול, 13",
 "city": "ירושלים",
 "state": "ישראל",
 "postalCode": 10021
 },
 "phoneNumbers": [
 "212 555-1234",
 "646 555-4567"
 ]
 }

```

תחביר
-----

### סוגי נתונים

סוגי המידע השונים בJSON הם:

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

מותר לשים מרווחים (Whitespace) בתוך קובץ JSON בין הסימנים המוסכמים (למשל בין ערך אחד במערך לערך הבא) ומי שקורא אותם יכול להתעלם מהם כל עוד הם אינם חלק ממחרוזת. ארבעה תווים נחשבים למרווח בהקשר זה: רווח, טאב, שורה חדשה וחזרה לתחילת השורה (CRLF).

גרסאות מוקדמות של JSON (כמו אלה שהוגדרו בRFC 4627) הגדירו שJSON תקין יכיל רק אובייקטים ומערכים, שיכולים להכיל את שאר סוגי המידע בתוכם. דרישה זו הוסרה בRFC 7158, שבו טקסט JSON הוגדר מחדש ככל טקסט שמכיל אחד מסוגי המידע שהוגדרו קודם.

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

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

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

JSONP
-----

JSONP (ראשי תיבות של **J**ava**S**cript **O**bject **N**otation with **P**adding) הוא שיטה להעברת מסמכי JSON בין אתרים בעלי כתובות אינטרנט שונות. כיוון שמנגנוני אבטחה בדפדפנים מגבילים העברת מסמכים בין אתרים (same-origin policy), מסמכי JSON כפי שהם אינם ניתנים להעברה. כדי לאפשר לאתרים אחרים לגשת לאובייקט JSON, המסמך יישמר בפורמט `.jsonp`, כאשר המידע במסמך נעטף בשם של פונקציית JavaScript הקיימת בדף האינטרנט שממנו טוענים את מסמך ה-JSONP, ובכך מהווה פרמטר של הפונקציה. בעת הטעינה, הפונקציה תופעל, ותוכל לגשת אל אובייקט ה-JSON דרך הפרמטרים שלה. להלן דוגמה למבנה מסמך JSONP:

```
fooBar({
 firstName: "יעקב",
 lastName: "ישראלי",
 address: {
 streetAddress: "רחוב המשעול, 13",
 city: "ירושלים",
 state: "ישראל",
 postalCode: 10021
 },
 phoneNumbers: [
 "212 555-1234",
 "646 555-4567"
 ]
});

```

בדוגמה שלמעלה, `fooBar` הוא שם הפונקציה שאליה מסמך ה-JSONP יקרא, והמידע המועבר זהה לאובייקט ה-JSON שהוצג בדוגמה הראשונה. דוגמה לפונקציה fooBar:

```
function fooBar(param) {
 alert("שם פרטי: "+ param.firstName + ", "+ "שם משפחה: "+ param.lastName);
}

```

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

ראו גם
------

* XML
* HTML5
* JSON-LD
* Microdata
* RDFa

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

ויקישיתוף מדיה וקבצים בנושא **JSON** בוויקישיתוף
* 

* אתר האינטרנט הרשמי של JSON (באנגלית)
* היכרות עם JSON, באתר json.org

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

1. ↑  A Deep Look at JSON vs. XML, Part 1: The History of Each, Toptal Engineering Blog (באנגלית)
2. ↑  ECMA-404, Ecma International (באנגלית אמריקאית)
3. ↑  BigInt - MDN Web Docs Glossary: Definitions of Web-related terms | MDN, developer.mozilla.org, ‏2023-06-08 (באנגלית אמריקאית)
4. ↑  Trailing commas - JavaScript | MDN, developer.mozilla.org, ‏2023-09-12 (באנגלית אמריקאית)

|  |  |
| --- | --- |
| בקרת זהויות עריכת הנתון בוויקינתונים | 
* NLI: 987007581416205171
* GND: 1105592812
* LCCN: sh2014000515

 |