json_encode将php索引数组转json数组、关联数组转json对象,行为取决于键是否为连续整数;中文需加json_unescaped_unicode;空数组、null等基础类型直接转换;遇不支持类型会报错,应检查数据类型并处理资源或循环引用。

json_encode 会把 PHP 索引数组转成 JSON 数组,关联数组转成 JSON 对象
这是最常被误解的一点:PHP 没有“纯数组”类型,json_encode 的行为完全取决于数组的键。只要数组键是连续的整数(从 0 开始),它就输出 [...];一旦出现非数字键或不连续数字键(比如 ['a' => 1] 或 [1 => 'x']),就输出 {...}。
实操建议:
- 用
array_values($arr)强制重置键为 0-based 索引,再传给json_encode,确保得到 JSON 数组 - 用
json_encode($arr, JSON_FORCE_OBJECT)强制所有数组都转成 JSON 对象(包括索引数组) - 检查原始数据:用
var_dump(array_keys($arr))看键是否全为连续整数
中文乱码?记得加 JSON_UNESCAPED_UNICODE
默认情况下,json_encode 会把 UTF-8 中文转成 \uXXXX 形式,看起来像乱码(其实是标准 JSON 行为,但前端读取时可能显示异常)。
实操建议:
- 必须加上
JSON_UNESCAPED_UNICODE标志:json_encode($data, JSON_UNESCAPED_UNICODE) - 如果还乱码,确认 PHP 文件本身是 UTF-8 编码(无 BOM),且
$data中字符串确实是 UTF-8(不是 GBK) - 不要试图用
iconv或mb_convert_encoding在json_encode前转码——除非你确定源字符集,否则极易出错
空数组、null、布尔值这些怎么处理
json_encode 对基础类型处理很直接,但容易在边界场景踩坑:
-
json_encode([])→[](空 JSON 数组) -
json_encode(new stdClass())→{}(空 JSON 对象) -
json_encode(null)→null(合法 JSON 值) -
json_encode(false)→false,true→true - 注意:PHP 的
NULL和空字符串''是不同的,前者转null,后者转""
遇到 Warning: json_encode(): type is not supported 错误怎么办
这个错误说明你传了 json_encode 不支持的类型,比如资源(resource)、闭包(Closure)、未实现 JsonSerializable 的对象、或者含有循环引用的结构。
实操建议:
- 先用
gettype($value)或var_dump($value)查看具体是什么类型 - 对资源(如
fopen返回值)提前判断:is_resource($val) ? null : $val - 对对象,要么让它实现
JsonSerializable接口,要么用(array) $obj强转(仅适用于公有属性) - 避免直接
json_encode($pdo)或json_encode($curl_handle)—— 它们都是资源
var_dump(json_last_error_msg()) 能省掉大半调试时间。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











