JSON Toolkit

האם NaN או Infinity יכולים להופיע ב-JSON

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

מתחילכ-3 דקות קריאהפורסם 2026-10-30עודכן 2026-10-30
מה באמת קורה ל-NaN ול-Infinity ב-JSON

שורה תחתונה: 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 דוחה

קריאה נוספת