json_encode()是php中将数组或对象转为json字符串的唯一官方标准方法,支持utf-8编码、自动类型转换和多种选项(如json_unescaped_unicode避免中文转义),不支持resource类型,遇循环引用会报错。

json_encode() 是唯一标准做法
PHP 里把数组转成 JSON 字符串,json_encode() 是官方且唯一推荐的方式,没有替代函数,也不需要手动拼接字符串。它会自动处理嵌套、类型转换(如 null → null、true → true)、中文编码和特殊字符转义。
中文乱码?加 JSON_UNESCAPED_UNICODE
默认情况下 json_encode() 会把中文转成 \uXXXX 形式,前端看着是乱码或显示为 Unicode 序列。这不是 bug,是默认行为。解决方法很简单:
$arr = ['name' => '张三', 'city' => '杭州'];
echo json_encode($arr, JSON_UNESCAPED_UNICODE); // {"name":"张三","city":"杭州"}
- 不加这个 flag:输出
{"name":"\u5f20\u4e09","city":"\u676d\u5dde"} - 只在 PHP 5.4+ 支持;旧版本必须自己用
mb_convert_encoding()配合正则替换,不建议 - 如果还乱码,检查原始数组字符串是否本身就是 GBK 编码 ——
json_encode()只接受 UTF-8
空数组/空对象输出差异:看 array 还是 stdClass
PHP 关联数组(键名非纯数字)转 JSON 是对象 {},索引数组(连续数字键)默认转成数组 []。但如果你手动用 (object)$arr 转成对象再 encode,哪怕内容为空,也会输出 {} 而不是 []:
$a = []; // 空索引数组 → json_encode → []
$b = ['a' => 1]; // 关联数组 → json_encode → {"a":1}
$c = (object)[]; // 强制对象 → json_encode → {}
$d = (object)['x' => 2]; // 对象属性 → json_encode → {"x":2}
- 前端常依赖结构判断类型,比如
Array.isArray(res),所以别随意用(object)转型 - 想让关联数组也输出
[]?只能用array_values($arr)重置键名,但会丢键名信息
遇到 Recursion detected 错误怎么办
这个错误不是数据太大,而是数组/对象里存在循环引用,比如 $a['parent'] = &$a;。PHP 的 json_encode() 不支持递归结构,直接报错:
Warning: json_encode(): recursion detected in ...
- 先用
var_dump($arr)或print_r($arr)检查是否有引用(看到&符号或*RECURSION*) - 临时方案:用
json_encode($arr, JSON_PARTIAL_OUTPUT_ON_ERROR)(PHP 7.3+),出错字段会被替换为null - 根本解法:提前用
unset()删掉循环引用字段,或用递归函数克隆并断开引用
JSON_UNESCAPED_UNICODE 导致中文被转义、误用对象转型改变 JSON 结构、忽略循环引用直接传参。其他参数像 JSON_PRETTY_PRINT 或 JSON_NUMERIC_CHECK 属于锦上添花,先确保这三处不出错,json_encode() 就基本不会翻车。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











