נתוני JSON (.json)
RFC תקןJavaScript Object Notation (JSON) הוא פורמט טקסט קל משקל וקריא לאדם להחלפת נתונים. שפות תכנות רבות תומכות בו, והוא נפוץ בממשקי API ברשת.
המר JSON ל-HTML
ממיר חינמי מ-JSON ל-HTML פועל בדפדפן. המר קבצים באופן מיידי במכשיר שלך.
כיווץ JSON אונליין
פרטי - הקבצים לעולם אינם עוזבים את המכשיר שלך
בדיקה ומטא-נתונים
מערכות הפעלה ומנתחי קבצים מזהים קבצי JSON על ידי בדיקת רצף הבייטים הבינארי הראשוני:
חתימת כותרת ברמת הבייט (Magic Bytes)
מערכות הפעלה ומנתחי קבצים מזהים קבצי JSON על ידי בדיקת רצף הבייטים הבינארי הראשוני:
חתימת HEX (היסט 0):
7B או 5Bייצוג ASCII: { or [
תקינה: RFC 8259 / ECMA-404 / ISO/IEC 21778
מפרט טכני
| מבנה המכולה | פורמט החלפת נתונים קל משקל, מבוסס טקסט, בלתי תלוי בשפה |
| דחיסה | Gzip, Brotli ו-Zstandard יכולים לדחוס טקסט JSON; גודל התוצאה תלוי בנתונים ובהגדרות. |
| סדר בתים (Endianness) | Unicode מקודד ב-UTF-8 (מומלץ ללא סימן סדר בייטים / BOM) |
| מרחבי צבע | לא ישים |
| ערוצים ומבנה | שישה טיפוסי נתונים בסיסיים: אובייקט (object), מערך (array), מחרוזת (string), מספר (number), בוליאני (boolean) ו-null |
| ממדים מרביים | בלתי מוגבל; מוגבל אך ורק על ידי זיכרון המפענח ואורך המחרוזת המקסימלי |
| שקיפות | לא ישים |
| הזרמה ופרוגרסיביות | NDJSON (Newline Delimited JSON) / JSON Lines מאפשרים עיבוד זרמים מדורג |
מטריצת השוואה טכנית: JSON מול מתחרים
| תכונה טכנית | JSON (נוכחי) | YAML | XML | Protocol Buffers |
|---|---|---|---|---|
| מורכבות תחבירית | מינימלית (6 סוגים, תחביר קפדני) | גבוהה (מבוססת הזחות, מפרט מורכב) | גבוהה (תגי סגירה מסורבלים, מרחבי שמות) | פורמט העברה בינארי המוגדר באמצעות סכימה |
| ביצועי פענוח | מהיר במיוחד בכל השפות המודרניות | איטי (פענוח מורכב של הזחות) | בינוניים עד איטיים (בניית DOM כבדה) | מהיר במיוחד (פענוח בינארי ללא העתקה) |
| תמיכה בהערות | לא (הושמטו במכוון כדי למנוע תפיחה של המטא-נתונים) | כן (הערות #) | כן (הערות <!-- -->) | כן בקובצי .proto |
| גודל המטען ברשת | טקסט קומפקטי; תוצאות הדחיסה תלויות בנתונים ובהגדרות | טקסט קומפקטי | טקסט ארוך (חזרתיות רבה של תגים) | בינארי קומפקטי במיוחד |
מצבי השחתה נפוצים ומדריך שחזור הקסדצימלי (Hex)
שגיאת תחביר (SyntaxError): אסימון בלתי צפוי , ב-JSON במיקום X.
גורם שורש: פסיק נגרר לאחר הפריט האחרון במערך או באובייקט, דבר אסור לחלוטין לפי תקן RFC 8259 JSON.
שחזור: הסר פסיקים נגררים אחרי מפתחות באובייקטים ואחרי פריטים במערכים לפני העברת הטקסט ל-JSON.parse().
שגיאת תחביר (SyntaxError): אסימון בלתי צפוי ' ב-JSON.
גורם שורש: מחרוזות או מפתחות המוקפים במרכאות בודדות ('') במקום במרכאות כפולות ("").
שחזור: החלף את כל המחרוזות והמפתחות המוקפים במרכאות בודדות במרכאות כפולות תקניות.
ניתוח אבטחה ווקטורי תקיפה נגד מנתחי פורמטים (parsers)
JSON מכיל טקסט בלבד ואינו מאפשר הרצת קוד ישירה, אך פענוח JSON ממקור בלתי מהימן עלול להוביל לזיהום אבטיפוס (Prototype Pollution), למתקפות ReDoS או למיצוי זיכרון.
ווקטורי תקיפה ידועים
- זיהום אבטיפוס (Prototype Pollution): מפתחות בשם '__proto__' או 'constructor' שמשנים את Object.prototype ביישומי JavaScript.
- מתקפת מניעת שירות באמצעות גלישת מחסנית שנגרמת ממבני JSON מקוננים מאוד (לדוגמה, 10,000 סוגריים פותחים).
- אובדן דיוק במספרים: מספרי JavaScript הגדולים מ-2^53 - 1 (9,007,199,254,740,991) מאבדים דיוק בלי שהדבר מדווח.
שיטות מומלצות להגנה: לעולם אל תעבד JSON באמצעות eval(). השתמש ב-JSON.parse() ונקה מאפייני '__proto__' בפונקציות רקורסיביות למיזוג אובייקטים.
היסטוריה ואבני דרך
יתרונות מרכזיים
- מבנה טקסט קריא לאדם, בעל תיאור עצמי ותמציתי.
- תמיכה מובנית בניתוח (parsing) המוטמעת במנועי JavaScript (JSON.parse) ובכל שפת תכנות מרכזית.
- מפרט קפדני המונע הרצת קוד שרירותית.
מגבלות טכניות וחסרונות
- אין תמיכה בהערות, פסיקים נגררים (trailing commas), או הפניות מעגליות לאובייקטים.
- אין טיפוסי נתונים בינאריים מקוריים (נתונים בינאריים חייבים להיות מקודדים ב-base64, מה שמגדיל את הנפח ב-33%).
- סריאליזציה לא יעילה בהשוואה לפורמטים בינאריים כמו Protocol Buffers או MessagePack.
עובדות טכניות מעניינות
- דאגלס קרוקפורד הוסיף את סעיף רישיון התוכנה 'התוכנה תשמש לטוב ולא לרעה' לכלי ה-JSMin JSON המקוריים.
- JSON הוא תת-קבוצה קפדנית של תחביר JavaScript, אך עד ES2019 תווים גולמיים שלא עברו escape מסוג U+2028 ו-U+2029 היו תקפים ב-JSON אך לא תקפים במחרוזות JavaScript.
- דאגלס קרוקפורד גילה שדפדפני אינטרנט מוקדמים יכלו להמיר JSON ישירות לאובייקטים באמצעות eval() המקורית של JavaScript, לפני שממשקי ה-API הייעודיים JSON.parse() תוקננו ב-ECMAScript 5.
שאלות טכניות נפוצות
מדוע JSON אינו מתיר הערות?
התחביר של JSON אינו מתיר הערות. מימושים עשויים לטפל בהרחבות ובנתונים ייחודיים ליישום בדרכים שונות, ולכן הפורמט לבדו אינו מבטיח פעולה הדדית.
כיצד מאחסנים מספרים שלמים (integers) בני 64 ביט ב-JSON מבלי לאבד דיוק?
טיפוס Number המקורי של JavaScript הוא מספר נקודה צפה בדיוק כפול לפי IEEE 754, התומך בייצוג מדויק רק של מספרים שלמים עד 2^53 - 1. מספרים שלמים בני 64 ביט (כמו מזהי מסד נתונים או חותמות זמן) חייבים להיות מסודרים כמחרוזות (למשל '1234567890123456789') ב-JSON.
מה ההבדל בין JSON לבין NDJSON / JSON Lines?
JSON רגיל עוטף מטען שלם באובייקט שורש יחיד או במערך יחיד, מה שמחייב מפענחים לטעון את כל הטקסט לפני פענוחו. NDJSON (Newline Delimited JSON) מפריד בין רשומות JSON תקינות באמצעות תווי שורה חדשה (\n), וכך מאפשר הזרמה חסכונית בזיכרון, שורה אחר שורה, של מערכי נתונים ענקיים בגודל של מספר ג'יגה-בייט.
זוגות המרה קשורים ל-JSON
המרת נתוני JSON לקוד מקור HTML הופכת זוגות מפתח-ערך מובנים וגולמיים למסמכי אינטרנט קריאים לבני אדם המוכנים להצגה בדפדפן.
המרת קוד מקור HTML לנתוני JSON הופכת מסמכי אינטרנט קריאים לבני אדם לזוגות מפתח-ערך מובנים לעיבוד פרוגרמטי וקליטה ב-API.
המרת סקריפט טקסטואלי של גיבוי SQL לפורמט JSON הופכת טבלאות מסד נתונים יחסי נוקשות לאובייקטים גמישים ומקוננים עבור יישומי אינטרנט מודרניים.
המרת קבצי טקסט JSON לא מובנים למסדי נתונים יחסיים מובנים של SQLite מאפשרת אינדוקס ושאילתות מהירים של רשומות נתונים גדולות.
המרת קבצי Adobe Swatch Exchange לאובייקטי JSON של צבעים מתרגמת פלטות עיצוב בינאריות לאובייקטי טקסט קריאים עבור יישומי אינטרנט מודרניים.
המרת נתוני טקסט של צבעי JSON לדגימות בינאריות מסוג Adobe ASE מגשרת בין אסימוני עיצוב מבוססי אינטרנט לבין יישומי פריסה שולחניים מקצועיים.
המרת קובצי טקסט של פלטות GIMP למבני Color JSON מאפשרת ליישומי אינטרנט לקרוא דגימות צבע ישירות ללא סקריפטים מורכבים לניתוח.
המרת קבצי JSON מובנים של צבעים למשתני CSS הופכת אובייקטי נתונים גולמיים למאפייני עיצוב מקוריים עבור אתרי אינטרנט.