Bolehkah NaN atau Infinity muncul dalam JSON
Inti pati: JSON hanya mempunyai literal nombor perpuluhan. JSON.stringify menukar NaN dan Infinity menjadi null tanpa amaran, sebab itulah "medan nombor kadangkala null" terus muncul dalam produksi.

Pokoknya: JSON tidak boleh mewakili NaN atau Infinity — JSON.stringify secara senyap menukar kedua-duanya menjadi null — jadi kodkan keadaan itu secara eksplisit dengan null serta medan sebab, atau nilai rentetan yang didokumentasikan.
JSON.stringify({ ratio: NaN, limit: Infinity });
// '{"ratio":null,"limit":null}'
Tiada ralat, tiada amaran. Dua nombor menjadi null.
Apa yang dibenarkan oleh tatabahasa
number = [ minus ] int [ frac ] [ exp ]
Perpuluhan sahaja. NaN dan Infinity ialah sentinel IEEE 754, bukan literal. Ditulis ke dalam JSON ia ialah pengecam tidak sah, dan kerana semantik perbandingannya berbeza merentasi bahasa, spesifikasi mengecualikannya dan bukannya memilih perwakilan.
Apa yang dilakukan oleh setiap bahasa sebaliknya
| Bahasa | Tingkah laku |
|---|---|
JavaScript JSON.stringify |
Mengeluarkan null secara senyap |
Python json.dumps |
Mengeluarkan NaN secara lalai (bukan standard); melontar dengan allow_nan=False |
Go encoding/json |
Mengembalikan unsupported value: NaN |
| Java Jackson | Mengeluarkan rentetan "NaN" secara lalai |
Empat tingkah laku untuk satu nilai. Apabila API merentas bahasa menunjukkan medan nombor yang berselang-seli null, semak lapisan ini dahulu.
Apa yang perlu dilakukan sebaliknya
Rentetan yang didokumentasikan. "NaN", "Infinity" dengan nota jenis. Kosnya ialah setiap pengguna perlu semakan eksplisit.
null serta medan status. Lebih baik: {"avgLatency": null, "avgLatencyStatus": "no-sample"}. Sebab itu bergerak bersama nilai.
Fikirkan semula unit. Kebanyakan hasil Infinity datang daripada pembahagian dengan sampel sifar. Mengembalikan null dan memaparkan "belum ada data" biasanya lebih sepadan dengan kebenaran perniagaan daripada nombor tak terhingga.
Perangkap berkaitan
- Pustaka carta memutuskan garisan pada
null— sahkan bahawa itulah yang anda mahu JSON.stringifyjuga menggugurkanundefined, fungsi dan simbol sepenuhnya; kunci itu lenyap dan bukannya menjadinullallow_nan=Truelalai Python menghasilkan output yang ditolak olehJSON.parse