למה פסיק בסוף שובר את JSON
שורה תחתונה: פסיקים בסוף חוקיים באובייקטים ליטרליים של JavaScript והרסניים ב-JSON. הנה השגיאה המדויקת, הדקדוק של RFC 8259 שגורם לה, ושלושה תיקונים שבאמת מחזיקים.

שורה תחתונה: JSON אוסר פסיקים בסוף בכל מקום — כשמפרס נכשל, מחקו את הפסיק האחרון עם מעצב; השתמשו ב-JSON5 או JSONC רק לפירוס סלחני מקומי, ותמיד פלטו JSON סטנדרטי למערכות אחרות.
כי הדקדוק אומר כך.
{
"name": "demo",
"size": 12,
}
JSON.parse זורק Unexpected token } in JSON at position 34. Node מנסח זאת אחרת, אבל כל מנוע מצביע לאותו מקום: הפסיק לפני }.
על מה המפרס באמת מתלונן
כלל הייצור של אובייקט ב-RFC 8259 הוא:
object = begin-object [ member *( value-separator member ) ] end-object
סוגריים מרובעים פירושם אופציונלי, הכוכבית פירושה אפס או יותר. במילים פשוטות: פסיקים מפרידים בין חברים, והחבר האחרון נעקב ישירות ב-}.
אז אחרי פסיק המפרס מוכן לשם חבר נוסף. הוא קורא } ונכשל. מערכים מתנהגים באופן זהה — [1, 2, 3,] נכשל ב-].
מאיפה מגיע ההרגל
אובייקטים ליטרליים של JavaScript מתירים פסיקים בסוף מאז ES5, וכך גם רשימות Python וליטרלים מורכבים ב-Go. עורכים מוסיפים אותם אוטומטית. ואז מישהו מעתיק אובייקט ליטרלי מקובץ .js לקובץ .json, והקובץ מפסיק להתפרס.
המקור הנפוץ הנוסף הוא JSON שנבנה ביד: לולאה שרצה עם i <= length משאירה פסיק אחרי האלמנט האחרון.
שלושה תיקונים
הסירו את הפסיק. בסדר לעריכות ידניות. הדביקו במעצב JSON והשגיאה מדווחת עם שורה ועמודה, כך שאתם רואים בדיוק איזה פסיק למחוק.
פרסו כ-JSON5. על-קבוצות מקבלות פסיקים בסוף, וזה בסדר לקונפיגורציה מקומית. זה לא בסדר לשום דבר שאתם שולחים למערכת אחרת — המקבל עדיין ידחה אותו.
הפסיקו לשרשר מחרוזות. השתמשו ב-JSON.stringify, json.dumps, Jackson. הסריאליזטור מטפל נכון במפרידים ופותר את הקידוד באותו זמן.
רשימת בדיקה מהירה
| איפה | סיבה טיפוסית |
|---|---|
| שירשור בלולאה | i <= length משאיר פסיק עודף אחד |
| העתק-הדבק | אובייקט ליטרלי שהועתק מקובץ JS |
| תבניות | פסיק קבוע בתוספת לולאה שמוסיפה עוד אחד |
| עריכה ידנית | השדה האחרון נמחק, הפסיק שלו נשאר |
שאלות ותשובות
למה פסיקים בסוף חוקיים ב-JavaScript אבל לא ב-JSON?
אובייקטים ליטרליים של JavaScript מתירים אותם מאז ES5, וכך גם רשימות Python וליטרלים מורכבים ב-Go, ולכן ההרגל מלווה אנשים אל תוך JSON. RFC 8259 מתיר פסיקים רק בין חברים: החבר האחרון נעקב ישירות ב-} או ב-]. העתקת אובייקט ליטרלי מקובץ .js לקובץ .json היא המקור הרגיל.
האם לפרס כ-JSON5 כדי לקבל פסיקים בסוף?
רק לקונפיגורציה מקומית. על-קבוצות מקבלות פסיקים בסוף, אבל כל דבר שאתם שולחים למערכת אחרת מתפרס כ-JSON קפדני ועדיין ייכשל. ייצרו JSON סטנדרטי בגבול הפלט במקום להסתמך על סובלנות המקבל.
איפה להסתכל קודם אחרי שגיאת פסיק בסוף?
התחילו במיקום שבהודעת השגיאה: הוא בדרך כלל מצביע על הפסיק לפני } או ]. אחר כך בדקו את שלושת המקורות הרגילים: לולאה שנכתבה עם i <= length, אובייקט ליטרלי שהודבק מקובץ JS, ותבנית שמוסיפה פסיק קבוע לצד לולאה. הדבקה במעצב מדווחת את השורה והעמודה המדויקות.