PHP json_encode() 遇 float 变 null 的根本原因是其默认拒绝非标浮点数(NaN、INF、-INF),遇之则整个字段置为 null 而不报错;常见诱因包括计算溢出、除零及未清洗的外部数据。
PHP json_encode() 遇到 float 变 null 的根本原因
这不是 PHP 的 bug,而是 json_encode() 对非标浮点数(如 NaN、INF、-INF)的默认拒绝策略。当某个字段值是 float 类型但实际为 INF 或 NAN 时,json_encode() 直接返回 null(注意:不是字符串 "null",而是整个字段被置为 null),且不报错、不警告。
常见诱因包括:
- 计算结果溢出(如
1e300 * 1e300→INF) - 除零(如
1.0 / 0.0→INF,0.0 / 0.0→NAN) - 从数据库或外部接口读取了未清洗的数值(如 MySQL 的
DOUBLE字段存了inf字面量) - 使用了
unserialize()后未校验浮点字段,再传给json_encode()
如何快速定位哪个字段导致 json_encode 返回 null
别靠猜。用 JSON_PARTIAL_OUTPUT_ON_ERROR + 逐层检测是最稳的路径:
- 先启用容错模式:
json_encode($data, JSON_PARTIAL_OUTPUT_ON_ERROR)—— 它会让非法浮点转成字符串"null"而非让整个 encode 失败 - 再配合递归检查:
is_finite($val)是核心判断,它对INF和NAN均返回false - 写个简单遍历函数,遇到
float且!is_finite($val)就记录路径(如$data['items'][2]['price'])
示例片段:
立即学习“PHP免费学习笔记(深入)”;