JSON

**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,  הפך לנוסח התקן הרשמי לשימושי הרשת של JSON.

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

```javascript
{
  "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 בין אתרים בעלי כתובות אינטרנט שונות. כיוון שמנגנוני אבטחה בדפדפנים מגבילים העברת מסמכים בין אתרים , מסמכי JSON כפי שהם אינם ניתנים להעברה. כדי לאפשר לאתרים אחרים לגשת לאובייקט JSON, המסמך יישמר בפורמט `.jsonp`, כאשר המידע במסמך נעטף בשם של פונקציית JavaScript הקיימת בדף האינטרנט שממנו טוענים את מסמך ה-JSONP, ובכך מהווה פרמטר של הפונקציה. בעת הטעינה, הפונקציה תופעל, ותוכל לגשת אל אובייקט ה-JSON דרך הפרמטרים שלה. להלן דוגמה למבנה מסמך JSONP:

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

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

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

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

### חסרונות
* **חוסר בתמיכה בהערות**: JSON אינו מאפשר הוספת הערות לתיעוד.
* **מגבלות מספריות**: חוסר אחידות בין שפות בתמיכה במספרים מדויקים.
* **רגישות לתחביר**: טעויות תחביריות, כגון פסיק נוסף, עלולות לגרום לשגיאות.

## JSON לעומת XML
JSON הפך לחלופה פופולרית ל-XML בזכות מספר יתרונות:
* קל יותר לכתוב ולקרוא.
* דורש פחות מקום לאחסון.
* נתמך באופן טבעי ב-JavaScript, בעוד XML דורש פרשנים נוספים.

עם זאת, XML עדיין בשימוש כאשר נדרשות תכונות מתקדמות כגון סכמות נתונים או מטה-נתונים.

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

### דוגמת JSONP
מסמך JSONP:

```javascript
fooBar({
  "name": "אילנה",
  "age": 27
});
```


## שימושים
JSON הוא אחד הפורמטים המרכזיים להעברת נתונים. בין יישומיו:
* RESTful API: העברת נתונים בין שירותי אינטרנט.
* אינטרנט של הדברים: הפעלת מכשירים חכמים באמצעות נתונים בפורמט JSON.
* אחסון נתונים: פורמט JSON משמש בסיסי נתונים כגון MongoDB ו-Firebase.

## הרחבות לפורמט JSON
* **JSON-LD**: תקן המרחיב את JSON לתמיכה בנתונים מקושרים.
* **JSON5**: גרסה גמישה יותר של JSON התומכת בהערות ותחביר מורחב.
* **BSON**: פורמט בינארי המבוסס על JSON, נפוץ בבסיסי נתונים.

## ראו גם
* XML
* HTML5

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

* 
* היכרות עם JSON, באתר json.org

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

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