php处理json的核心是json_encode()和json_decode(),前者遇不可序列化类型静默返回null,后者默认返回对象而非数组,需用true参数转数组;中文乱码需确保utf-8编码,长数字精度丢失须启用json_bigint_as_string。

PHP 处理 JSON 数据的核心就是 json_encode() 和 json_decode() 两个函数,它们原生支持、无需扩展(PHP ≥ 5.2.0),但实际用错的地方远比想象中多。
json_encode() 编码失败时为什么返回 null?
这不是 bug,而是默认行为:只要输入数据里有无法 JSON 化的类型(比如资源句柄、不可序列化的对象、循环引用),json_encode() 就静默返回 null,且不抛异常。
- 检查是否含
resource(如未关闭的fopen()返回值)或SimpleXMLElement对象 —— 先转成数组再编码 - 遇到中文乱码?确保传入的是 UTF-8 编码字符串;非 UTF-8 字符串需先用
mb_convert_encoding($str, 'UTF-8', 'GB2312') - 想让中文不被转义为
\u4f60?加参数JSON_UNESCAPED_UNICODE:json_encode($data, JSON_UNESCAPED_UNICODE) - 空数组被编码成
[],但想强制为对象{}?给数组加键名或用(object)[]
json_decode() 解析后是对象还是数组?
默认返回 stdClass 对象,不是关联数组 —— 这导致很多新手写 $data['name'] 报错 “Cannot use object of type stdClass as array”。
- 要数组?第二个参数设为
true:json_decode($json, true) - 解析失败时返回
null,不是 false;用json_last_error()查具体错误,比如JSON_ERROR_SYNTAX表示格式错误 - 深层嵌套对象/数组混用时,建议统一用数组模式(
true),避免->和[]混用出错 - 注意浮点数精度:PHP 默认会把
1.0解析成整型1,若需严格保留类型,得自己预处理或用JSON_BIGINT_AS_STRING
遇到 JSON 中的数字超长(如微信 openid、bigint ID)被截断怎么办?
PHP 的整型有平台限制(32 位系统最大约 21 亿),而 JSON 中的长数字(如 17 位微信 openid)会被 json_decode() 自动转成 int 或 float,造成精度丢失甚至科学计数法变形。
立即学习“PHP免费学习笔记(深入)”;
- 解决方案:始终启用
JSON_BIGINT_AS_STRING标志:json_decode($json, true, 512, JSON_BIGINT_AS_STRING) - 该标志强制将大整数转为字符串,避免隐式类型转换
- 注意:它只对顶层和嵌套中的纯数字生效,不作用于带小数点的数字(那些本来就会转成 float)
- 如果你在接收第三方 API 响应(如微信、支付宝),这条必须加,否则
openid可能变成1.23456789e+16或截断
真正容易被忽略的,是错误处理和类型一致性 —— 不检查 json_last_error() 就直接用解码结果,或者在对象/数组模式间随意切换,都会让问题延迟暴露到下游逻辑里才崩掉。











