האם NaN או Infinity יכולים להופיע ב-JSON
שורה תחתונה: ל-JSON יש רק ליטרלים של מספרים עשרוניים. JSON.stringify הופך NaN ו-Infinity ל-null בלי אזהרה, ולכן "שדה המספר לפעמים null" ממשיך להופיע בפרודקשן.

שורה תחתונה: JSON לא יכול לייצג NaN או Infinity — JSON.stringify הופך את שניהם בשקט ל-null — אז קדדו את המצב במפורש עם null בתוספת שדה סיבה, או ערך מחרוזת מתועד.
JSON.stringify({ ratio: NaN, limit: Infinity });
// '{"ratio":null,"limit":null}'
אין שגיאה, אין אזהרה. שני מספרים הופכים ל-null.
מה הדקדוק מתיר
number = [ minus ] int [ frac ] [ exp ]
עשרוני בלבד. NaN ו-Infinity הם sentinels של IEEE 754, לא ליטרלים. כתובים ב-JSON הם מזהים לא תקינים, ומכיוון שסמנטיקת ההשוואה שלהם שונה בין שפות, המפרט מוציא אותם במקום לבחור ייצוג.
מה כל שפה עושה במקום
| שפה | התנהגות |
|---|---|
JavaScript JSON.stringify |
פולט null בשקט |
Python json.dumps |
פולט NaN כברירת מחדל (לא סטנדרטי); זורק עם allow_nan=False |
Go encoding/json |
מחזיר unsupported value: NaN |
| Java Jackson | פולט את המחרוזת "NaN" כברירת מחדל |
ארבע התנהגויות לערך אחד. כש-API חוצה-שפות מציג שדה מספרי שהוא null לסירוגין, בדקו קודם את השכבה הזו.
מה לעשות במקום
מחרוזות מתועדות. "NaN", "Infinity" עם הערת טיפוס. עולה לכל צרכן בדיקה מפורשת.
null בתוספת שדה סטטוס. עדיף: {"avgLatency": null, "avgLatencyStatus": "no-sample"}. הסיבה נוסעת עם הערך.
חשבו מחדש על היחידה. רוב תוצאות ה-Infinity מגיעות מחלוקה באפס דגימות. החזרת null והצגת "אין נתונים עדיין" מתאימה בדרך כלל לאמת העסקית יותר ממספר אינסופי.
מלכודות קשורות
- ספריות גרפים שוברות את הקו על
null— ודאו שזה מה שאתם רוצים JSON.stringifyגם משמיטundefined, פונקציות ו-symbols לגמרי; המפתחות האלה נעלמים במקום להפוך ל-null- ברירת המחדל
allow_nan=Trueשל Python מפיקה פלט ש-JSON.parseדוחה