php中json数字变字符串的根本原因是php变量实际类型为字符串,json_encode()忠实输出;解决方法包括使用json_numeric_check标志或源头强制类型转换。

PHP 里 JSON 中的数字变成字符串,根本原因不在 JSON 本身,而在于 PHP 数据在 json_encode() 前的**实际类型**——如果它在 PHP 中是字符串(哪怕内容纯数字),就会被加引号输出,前端 JSON.parse() 就得到字符串。
根源:PHP 类型决定 JSON 字面量格式
JSON 规范里 123 是数字,"123" 是字符串。而 json_encode() 完全忠实于输入变量的 PHP 类型:
-
$row['id'] = 100;(int)→ 输出100→ 前端解析为 number -
$row['price'] = "99.99";(string)→ 输出"99.99"→ 前端解析为 string - 数据库中用
DECIMAL或AVG()计算出的值,经 DB2/MySQL 驱动返回后常为 string 类型,不是 float
典型场景:数据库字段“看着像数字,其实是字符串”
尤其常见于聚合查询或定点数字段:
-
SELECT AVG(price) AS avg_price FROM orders→ PHP 中$row['avg_price']往往是字符串"45.67",不是 float -
CAST(total AS DECIMAL(10,2))→ 即使结果精确,驱动仍可能返回 string - 从 CSV、Excel 或旧系统导入的数据,数字常以字符串形式读入,未做类型转换
解决方法:用 JSON_NUMERIC_CHECK 强制识别
PHP 5.3.3+ 提供 JSON_NUMERIC_CHECK 标志,它会扫描数组中所有值,对纯数字字符串(如 "123"、"-45.6"、"0.00")自动转为不带引号的数字字面量:
$data = ['id' => '100', 'price' => '99.99', 'name' => 'book'];
echo json_encode($data, JSON_NUMERIC_CHECK);
// 输出:{"id":100,"price":99.99,"name":"book"}
⚠️ 注意:它只处理「纯数字字符串」,像 "123abc" 或 " 45 "(含空格)不会转换,需先 trim() 或 floatval() 清洗。
更彻底的做法:源头保证 PHP 类型正确
比起依赖 JSON_NUMERIC_CHECK 补救,建议在数据进入 json_encode() 前就规范类型:
- 对已知应为数字的字段,显式转换:
$row['price'] = (float)$row['price'];或floatval($row['price']) - 使用 PDO 时设置
PDO::ATTR_EMULATE_PREPARES = false并启用PDO::ATTR_STRINGIFY_FETCHES = false,有助于保留数值类型 - DB2 驱动可尝试配置
return_decimal_as_float = 1(视版本支持)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











