WMX · 随记
·Python· 3 分钟阅读

JSON 数字:NaN 不是跨语言接口的可靠值

Python 默认允许把 NaN 编码成特殊字面量,但严格 JSON 消费者可能拒绝它。一个本地能往返的对象不一定是合规的交换格式。

Python 系列概览:输入校验、数据处理与行为验证
Python 系列概览:输入校验、数据处理与行为验证 点击图片查看大图 ↗

问题从哪里出现

Python 默认允许把 NaN 编码成特殊字面量,但严格 JSON 消费者可能拒绝它。一个本地能往返的对象不一定是合规的交换格式。

理解核心机制

json.dumps(..., allow_nan=False) 会拒绝 NaN 和无穷值。加载时可用 parse_constant 拒绝非标准常量;业务上还要决定缺失测量值应表示为 null 还是错误。

动手做一个小实验

Python 3.11 或更新版本,仅使用标准库;将示例保存为 demo.py 后执行 python3 demo.py。

Python9 行 · 可横向滚动
import json
import math
try:
    json.dumps({"score": math.nan}, allow_nan=False)
except ValueError:
    print("non-finite number rejected")
text = json.dumps({"score": None, "name": "示例"}, ensure_ascii=False, allow_nan=False)
assert json.loads(text)["score"] is None
print(text)

适用边界与常见误区

合法 JSON 也可能不符合业务 schema。超大数字、重复键、嵌套深度和输入大小仍需根据接口风险设置约束。

继续练习

为 NaN、Infinity、None 和普通小数建立跨语言样本,明确哪几种输入应该在服务端边界被拒绝。

参考资料

阅读相关官方文档或原始资料 ↗

← 返回文章归档