NaN hay Infinity có thể xuất hiện trong JSON không
Kết luận: JSON chỉ có số thập phân dạng literal. JSON.stringify biến NaN và Infinity thành null mà không cảnh báo, đó là lý do câu "trường số thỉnh thoảng lại null" cứ xuất hiện trên môi trường production.

Tóm lại: JSON không thể biểu diễn NaN hay Infinity — JSON.stringify lặng lẽ biến cả hai thành null — nên hãy mã hóa trạng thái một cách tường minh bằng null kèm trường lý do, hoặc một giá trị chuỗi có tài liệu.
JSON.stringify({ ratio: NaN, limit: Infinity });
// '{"ratio":null,"limit":null}'
Không lỗi, không cảnh báo. Hai con số trở thành null.
Ngữ pháp cho phép gì
number = [ minus ] int [ frac ] [ exp ]
Chỉ số thập phân. NaN và Infinity là các giá trị đặc biệt của IEEE 754, không phải literal. Khi viết vào JSON chúng là định danh không hợp lệ, và vì ngữ nghĩa so sánh của chúng khác nhau giữa các ngôn ngữ, đặc tả loại trừ chúng thay vì chọn một cách biểu diễn.
Mỗi ngôn ngữ làm gì thay vào đó
| Ngôn ngữ | Hành vi |
|---|---|
JavaScript JSON.stringify |
Lặng lẽ phát ra null |
Python json.dumps |
Mặc định phát ra NaN (không chuẩn); ném lỗi với allow_nan=False |
Go encoding/json |
Trả về unsupported value: NaN |
| Java Jackson | Mặc định phát ra chuỗi "NaN" |
Bốn hành vi cho một giá trị. Khi một API đa ngôn ngữ hiển thị trường số thỉnh thoảng lại null, hãy kiểm tra tầng này trước tiên.
Nên làm gì thay thế
Chuỗi có tài liệu. "NaN", "Infinity" kèm ghi chú kiểu. Đòi hỏi mọi bên tiêu thụ phải kiểm tra tường minh.
null kèm trường trạng thái. Tốt hơn: {"avgLatency": null, "avgLatencyStatus": "no-sample"}. Lý do đi cùng giá trị.
Xem lại đơn vị. Hầu hết kết quả Infinity đến từ việc chia cho mẫu bằng không. Trả về null và hiển thị "chưa có dữ liệu" thường khớp với sự thật nghiệp vụ hơn là một con số vô hạn.
Những cái bẫy liên quan
- Thư viện biểu đồ sẽ đứt đường tại
null— hãy xác nhận đó đúng là điều bạn muốn JSON.stringifycũng bỏ qua hoàn toànundefined, hàm và symbol; những khóa đó biến mất chứ không thànhnull- Cấu hình mặc định
allow_nan=Truecủa Python tạo ra đầu ra màJSON.parsetừ chối