json_encode() 是php生成json的唯一可靠方式,它自动处理utf-8编码、转义、类型映射和循环引用检测,但需配合json_last_error()检查错误、确保输入为utf-8,并正确设置header与参数组合。

json_encode() 是唯一靠谱的 JSON 生成方式
PHP 里手拼 JSON 字符串(比如 "{'name':'a'}")是危险操作,容易因引号、转义、中文编码出错,json_encode() 是官方且唯一推荐的生成方法。它自动处理 UTF-8 编码、特殊字符转义、类型映射(如 null → null,array() → [] 或 {}),还能检测循环引用。
常见错误现象:json_encode() 返回 false 却没检查,导致前端收到空字符串或 null;或传入非 UTF-8 编码的字符串(如 GBK),结果变成 null。
- 务必用
json_last_error()检查失败原因,比如JSON_ERROR_UTF8就得先mb_convert_encoding($str, 'UTF-8', 'GBK') - 关联数组默认转成 JSON 对象(
{}),索引数组转成 JSON 数组([]);想强制转对象,可用(object)$arr - PHP 7.3+ 支持
JSON_UNESCAPED_UNICODE,否则中文会被转成\uXXXX,前端显示正常但调试困难
中文乱码?先确认输入数据是 UTF-8
json_encode() 不负责编码转换,只忠实地序列化已有的字符串。如果数据库字段是 latin1、文件读取没指定编码、或 POST 数据来自老式表单(未设 accept-charset="UTF-8"),传进去的字符串本身就不对,再怎么加选项也白搭。
使用场景:从 MySQL 查询后直接 json_encode($row),结果中文变 null 或乱码。
立即学习“PHP免费学习笔记(深入)”;
- 查库前执行
mysqli_set_charset($conn, 'utf8mb4')(不是utf8) - 读文件时用
file_get_contents()后,用mb_detect_encoding()确认,必要时mb_convert_encoding($content, 'UTF-8', 'GB2312') - 不依赖浏览器自动判断编码,所有 HTTP 请求头显式声明
Content-Type: application/json; charset=utf-8
json_encode() 的常见参数组合与坑
光会写 json_encode($data) 不够,不同场景需要不同标志位,错配会导致前端解析失败或性能问题。
参数差异:JSON_PRETTY_PRINT 方便调试但增大体积;JSON_NUMERIC_CHECK 把数字字符串(如 "123")转成整数,可能破坏 API 兼容性(比如订单号 "000123" 变成 123)。
- API 输出必加
JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES,减少传输量 - 避免同时用
JSON_FORCE_OBJECT和JSON_NUMERIC_CHECK——空数组[]会被强制转成对象,再加数字检查可能引发意外类型转换 - 大数组慎用
JSON_PRETTY_PRINT,格式化开销明显,Nginx/CDN 也不缓存带空格的响应体
返回 JSON 前必须设置正确的 header
只输出 JSON 字符串,不设 header,浏览器或前端框架很可能当文本(text/html)解析,导致 CORS 错误、MIME 类型警告或自动下载。
错误现象:Chrome 控制台报 Unexpected token ,其实是 HTML(比如 PHP 错误页)混在了 JSON 前面。
- 务必在
echo json_encode(...)前调用header('Content-Type: application/json; charset=utf-8') - 确保没有
echo、var_dump、BOM 字节或空白行出现在json_encode()之前 - 用
ob_start()+ob_clean()清除已有输出,比靠运气更可靠
json_encode() 返回 false 时的错误捕获——这三个点卡住的人,远多于语法不会写。











