php的json处理依赖json_encode()和json_decode()实现字符串与数组/对象的双向转换,核心问题是编码一致性、数据类型兼容性及解析后安全取值。

PHP 中的 JSON 就是字符串和数组/对象之间的翻译器
PHP 本身不直接“懂” JSON,它靠 json_encode() 和 json_decode() 这两个函数做双向转换。JSON 是纯文本格式,而 PHP 处理的是变量、数组、对象——这两者之间必须有人翻译,PHP 的 JSON 扩展就是干这个的。
常见错误现象:json_decode() 返回 null 却没报错;json_encode() 输出空字符串;前端收不到预期数据结构。
- 根本原因几乎都是编码不一致:输入字符串不是合法 JSON(比如中文乱码、BOM 头、单引号代替双引号)
-
json_decode()默认返回stdClass对象,想用数组得传第二个参数true - PHP 7+ 的解析器更严格,会拒绝含控制字符或非法 Unicode 的字符串(老版本可能默默忽略)
json_encode() 编码失败的三个高频原因
不是所有 PHP 值都能无损转成 JSON。一旦出问题,json_encode() 默认静默失败,只返回 false,很容易被忽略。
- 含非 UTF-8 字符的字符串(如 GBK 编码的中文)→ 先用
mb_convert_encoding($str, 'UTF-8', 'auto') - 资源类型(resource)、闭包(closure)、循环引用对象 → 会直接返回
false,需提前过滤或实现JsonSerializable接口 - 浮点数精度问题:PHP 默认用
serialize_precision配置控制小数位数,可能导致json_encode(0.1 + 0.2)输出0.30000000000000004
json_decode() 解析后怎么安全取值
别一上来就写 $data->name 或 $data['name'],先确认解码结果是否有效。
立即学习“PHP免费学习笔记(深入)”;
- 永远用
json_last_error() === JSON_ERROR_NONE检查解码状态,而不是只看返回值是否为null - 如果要取字段,推荐统一转成关联数组:
json_decode($json, true),避免对象属性访问时触发 Notice - 深层嵌套结构建议配合
??或isset()判断,例如:($data['user']['profile']['avatar'] ?? '')
PHP 8.2+ 新增 json_validate() 很实用,但别误用
json_validate() 只判断字符串是否为合法 JSON,不做解析,也不校验语义(比如字段名重复、值超长等),适合前置校验。
- 不能替代
json_decode()后的业务逻辑校验 - 对大字符串性能好(比
json_decode()快约 3–5 倍),适合 API 入口快速拦截明显非法请求体 - 注意:它不检查编码,UTF-8 BOM 头会导致返回
false,需先用ltrim($json, "\xEF\xBB\xBF")清理
最常被忽略的一点:JSON 标准禁止尾部逗号、允许键名带空格但要求双引号包裹、不支持 undefined 或 NaN——这些在 PHP 侧不会自动修正,出问题时得回溯源头数据生成逻辑,而不是只盯 PHP 函数。










