You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:16:32