JSON Toolkit

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.

Người mớiĐọc khoảng 3 phútXuất bản 2026-10-30Cập nhật 2026-10-30
Điều gì thực sự xảy ra với NaN và Infinity trong JSON

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.stringify cũng bỏ qua hoàn toàn undefined, hàm và symbol; những khóa đó biến mất chứ không thành null
  • Cấu hình mặc định allow_nan=True của Python tạo ra đầu ra mà JSON.parse từ chối

Đọc thêm