Bisakah NaN atau Infinity muncul di JSON
Intinya: JSON hanya memiliki literal angka desimal. JSON.stringify mengubah NaN dan Infinity menjadi null tanpa peringatan, itulah sebabnya "field angka kadang-kadang null" terus muncul di produksi.

Intinya: JSON tidak dapat merepresentasikan NaN atau Infinity — JSON.stringify diam-diam mengubah keduanya menjadi null — jadi nyatakan statusnya secara eksplisit dengan null plus field alasan, atau nilai string yang terdokumentasi.
JSON.stringify({ ratio: NaN, limit: Infinity });
// '{"ratio":null,"limit":null}'
Tanpa error, tanpa peringatan. Dua angka menjadi null.
Apa yang diizinkan tata bahasa
number = [ minus ] int [ frac ] [ exp ]
Hanya desimal. NaN dan Infinity adalah sentinel IEEE 754, bukan literal. Ditulis ke JSON, mereka adalah identifier yang tidak valid, dan karena semantik perbandingannya berbeda antar bahasa, spesifikasi mengecualikannya alih-alih memilih satu representasi.
Apa yang dilakukan setiap bahasa sebagai gantinya
| Bahasa | Perilaku |
|---|---|
JavaScript JSON.stringify |
Diam-diam menghasilkan null |
Python json.dumps |
Menghasilkan NaN secara default (non-standar); melempar error dengan allow_nan=False |
Go encoding/json |
Mengembalikan unsupported value: NaN |
| Java Jackson | Menghasilkan string "NaN" secara default |
Empat perilaku untuk satu nilai. Ketika API lintas bahasa menampilkan field angka yang kadang-kadang null, periksa lapisan ini lebih dulu.
Apa yang sebaiknya dilakukan
String yang terdokumentasi. "NaN", "Infinity" dengan catatan tipe. Membebani setiap konsumen dengan pemeriksaan eksplisit.
null plus field status. Lebih baik: {"avgLatency": null, "avgLatencyStatus": "no-sample"}. Alasannya ikut bersama nilainya.
Pikirkan ulang satuannya. Sebagian besar hasil Infinity berasal dari pembagian dengan nol sampel. Mengembalikan null dan menampilkan "belum ada data" biasanya lebih sesuai dengan kenyataan bisnis daripada angka tak hingga.
Jebakan terkait
- Pustaka chart memutus garis pada
null— pastikan itu yang Anda inginkan JSON.stringifyjuga membuangundefined, fungsi dan symbol sepenuhnya; key tersebut menghilang alih-alih menjadinullallow_nan=Truedefault di Python menghasilkan output yang ditolakJSON.parse