آیا NaN یا Infinity میتواند در JSON ظاهر شود
جمعبندی: JSON فقط literalهای عدد اعشاری دارد. 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 نگهبانهای IEEE 754 هستند، نه literal. اگر در JSON نوشته شوند شناسههای نامعتبرند، و چون معناشناسی مقایسهشان بین زبانها متفاوت است، استاندارد بهجای انتخاب یک نمایش آنها را کنار میگذارد.
هر زبان بهجایش چه میکند
| زبان | رفتار |
|---|---|
JSON.stringify در جاوااسکریپت |
بیصدا null میدهد |
json.dumps در Python |
بهصورت پیشفرض NaN میدهد (غیراستاندارد)؛ با allow_nan=False خطا میدهد |
encoding/json در Go |
unsupported value: NaN برمیگرداند |
| Jackson در Java | بهصورت پیشفرض رشته "NaN" میدهد |
چهار رفتار برای یک مقدار. وقتی یک API بینزبانی فیلد عددی نشان میدهد که گهگاه null است، اول این لایه را بررسی کنید.
بهجایش چه کنیم
رشتههای مستندشده. "NaN"، "Infinity" با یادداشت نوع. هزینهاش یک بررسی صریح برای هر مصرفکننده است.
null بههمراه فیلد وضعیت. بهتر: {"avgLatency": null, "avgLatencyStatus": "no-sample"}. دلیل همراه مقدار سفر میکند.
واحد را بازاندیشی کنید. بیشتر نتایج Infinity از تقسیم بر نمونه صفر میآیند. برگرداندن null و نمایش «هنوز دادهای نیست» معمولاً با حقیقت کسبوکار بهتر میخواند تا یک عدد بینهایت.
تلههای مرتبط
- کتابخانههای نمودار روی
nullخط را میشکنند — تأیید کنید این همان چیزی است که میخواهید JSON.stringifyهمچنینundefined، تابع و symbol را کاملاً حذف میکند؛ آن کلیدها ناپدید میشوند نه اینکهnullشوند- پیشفرض
allow_nan=Trueدر Python خروجیای تولید میکند کهJSON.parseردش میکند