PHP json_decode无法解析以0开头的数字,该如何解决?
解决PHP json_decode解析带前导0的税码/手机号问题
这个问题我之前也踩过坑!PHP 7.0+开始严格遵循RFC 7159规范,确实会拒绝带前导0的非零数字(比如02205340793),而且就算侥幸能解析,这类值也会被当成纯数字处理,直接丢失关键的前导0——这对税码、手机号这类依赖前导0标识的字符串来说完全不可接受。
最佳处理思路:转为字符串
毫无疑问,税码、手机号这类数据属于字符串型标识符,不是用于数学计算的数值,所以把它们以字符串形式存储和解析是最合理的方案。下面分两种常见场景给出具体实现:
场景1:能控制JSON数据源(优先推荐)
如果可以修改生成JSON的源头(比如后端接口、数据导出脚本),直接在生成时给这些带前导0的字段加上双引号,从根源解决问题:
{"cod_fiscale":"02205340793", "phone":"0123456789"}
这样PHP用json_decode()解析时,会直接得到字符串类型的值,完美保留前导0,也不会触发语法错误。
场景2:无法修改数据源,只能在PHP端处理
如果没办法调整JSON源头,就需要先预处理JSON字符串,把目标字段的数值转成字符串。这里用正则表达式精准匹配替换是最实用的方法:
比如针对cod_fiscale和phone这两个特定字段,代码可以这么写:
// 原始JSON字符串(实际场景中可能来自文件、接口响应等) $rawJson = '{"cod_fiscale":02205340793, "phone":0123456789, "age":25}'; // 正则替换:匹配指定字段后的数字,给数字包裹双引号 $processedJson = preg_replace('/("(cod_fiscale|phone)":)(\d+)/', '$1"$3"', $rawJson); // 解析处理后的JSON $data = json_decode($processedJson, true); // 现在$data['cod_fiscale']是字符串"02205340793",前导0完整保留 var_dump($data['cod_fiscale']);
如果需要更通用的匹配(比如所有以0开头且长度大于1的数字值),可以调整正则规则(注意要避免误匹配合法的纯数值,比如25这类正常数字):
$processedJson = preg_replace('/(\w+):(\d{2,})/', '$1:"$2"', $rawJson);
补充提醒
- 别尝试用
JSON_BIGINT_AS_STRING参数,这个是用来处理超出PHP整数范围的大数字的,对前导0的问题完全无效。 - PHP 7.0+遇到带前导0的数字会直接抛出
JSON_ERROR_SYNTAX错误,所以预处理是必须的,否则json_decode会返回null。
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

