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 قيم حارسة في 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 والدوال والرموز تمامًا؛ فتختفي تلك المفاتيح بدلًا من أن تصبح null
  • allow_nan=True الافتراضي في Python ينتج خرجًا يرفضه JSON.parse

قراءة إضافية