php数组与json互转需注意:关联数组转对象、索引数组转数组;中文需utf-8编码并用json_unescaped_unicode;json_decode需显式设$assoc=true获取关联数组;nan/inf转null,循环引用会失败;务必校验json_last_error()。

PHP 中数组与 JSON 互转看似简单,但实际开发中常因数据类型、编码、嵌套结构或特殊字符处理不当导致出错。关键在于理解 json_encode() 和 json_decode() 的行为边界和默认约束。
数组转 JSON:注意键名、类型与中文编码
PHP 关联数组会转为 JSON 对象({}),索引数组转为 JSON 数组([])。若键名为数字字符串(如 "1"),PHP 会自动转为整型键,但 json_encode() 仍按原键输出;若键为纯数字且连续,可能被误判为索引数组,导致意外丢键。
- 确保键名合法:避免空字符串、null 或不可见字符作键名,否则
json_encode()返回 false - 中文默认 UTF-8 编码:若源数组含 GBK 等编码的中文,需先用
mb_convert_encoding($arr, 'UTF-8', 'GBK')转换,否则出现乱码或编码失败 - 使用
JSON_UNESCAPED_UNICODE选项保留中文不转义:json_encode($arr, JSON_UNESCAPED_UNICODE) - 遇到
null、资源、闭包等无法序列化的值时,json_encode()返回 false,建议用json_last_error()检查错误
JSON 转数组:对象还是关联数组?
json_decode($json, $assoc = false) 第二个参数决定返回类型:false(默认)→ stdClass 对象;true → 关联数组。这点极易忽略,导致用 $data['key'] 访问对象时报错。
- 推荐显式传
true:尤其在处理 API 返回或配置文件时,关联数组更符合 PHP 开发习惯 - 深层嵌套 JSON 若含数字键字符串(如
"0"、"100"),即使设$assoc=true,PHP 仍会将其转为整型键,但不影响取值 - 若 JSON 含浮点数,PHP 会转为 float 类型;科学计数法(如
1e5)也能正确解析
特殊值与边缘情况处理
JSON 标准不支持 PHP 的某些类型,转换时会发生隐式转换或报错:
立即学习“PHP免费学习笔记(深入)”;
-
NaN、INF、-INF在json_encode()中被转为null(PHP 7.1+ 默认),可用JSON_PARTIAL_OUTPUT_ON_ERROR避免整个失败 - 循环引用(如对象 A 包含 B,B 又引用 A)会导致
json_encode()失败并返回 false,需提前解耦或用serialize()替代 - JSON 中的
null解码后是 PHP 的null;空字符串""、数字0、布尔false均保持原类型,不会被转成 null - 时间戳、日期字符串(如
"2024-05-20")只是普通字符串,不会自动转为 DateTime 对象,需手动处理
调试与容错建议
生产环境不要依赖 json_encode() 或 json_decode() 的静默失败。应始终校验结果与错误码:
- 编码后检查是否为 string:
is_string($json) && !empty($json) - 解码后检查是否为 array/object:
is_array($data) || is_object($data),再结合json_last_error() === JSON_ERROR_NONE - 对不可信输入(如用户提交的 JSON 字符串),加
JSON_THROW_ON_ERROR(PHP 7.3+)让异常更明确 - 大数组转 JSON 前可估算长度,避免内存溢出;必要时用
json_encode($arr, JSON_PARTIAL_OUTPUT_ON_ERROR)容忍部分字段丢失











