PHP接口中数组转JSON需调用json_encode()并传入JSON_UNESCAPED_UNICODE等选项确保中文正常显示,配合header('Content-Type: application/json; charset=utf-8')设置响应头,且必须检查返回值是否为false并用json_last_error_msg()捕获错误。

PHP接口里怎么把数组转成JSON返回
绝大多数 PHP 接口的「数据转换」第一步就是把后端数组变成前端能直接用的 JSON。关键不是调用 json_encode() 就完事,而是得控制输出行为和错误处理。
-
json_encode()默认不支持中文 UTF-8 字符(会转成\uXXXX),加JSON_UNESCAPED_UNICODE参数才能原样输出中文 - 如果数组含资源(如 MySQLi 连接句柄)或循环引用,
json_encode()会静默失败并返回false,务必用json_last_error()检查 - 别忘了设响应头:
header('Content-Type: application/json; charset=utf-8');,否则前端可能解析失败或乱码 - 示例片段:
header('Content-Type: application/json; charset=utf-8');
$data = ['code' => 0, 'msg' => '成功', 'data' => ['name' => '张三']];
echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
遇到对象传参怎么转成数组再输出
很多框架或 ORM 返回的是对象(比如 Laravel 的 Eloquent Model、ThinkPHP 的 Db::find()),但 json_encode() 虽然能处理对象,但默认只序列化 public 属性,且可能暴露内部状态。稳妥做法是先转成数组。
- 原生对象:用
(array)强制转换只适用于简单对象,对有 private/protected 属性或 __get() 的类会丢失字段 - Laravel 模型:优先用
$model->toArray()或$model->toJson()(后者已内置处理) - 通用安全方案:用
json_decode(json_encode($obj), true)—— 先转 JSON 再解回关联数组,能绕过访问控制,但性能略低,仅用于不确定结构的场景 - 注意:该技巧无法还原 DateTime 对象等特殊类型,会变成字符串,如有时间字段需提前格式化
接口要兼容 XML 和 JSON 怎么做内容协商
有些老系统或第三方要求支持多种格式,靠 URL 后缀(如 ?format=json)或 Accept 请求头判断更规范。
- 读取
$_SERVER['HTTP_ACCEPT']判断客户端期望格式,例如application/json或application/xml - XML 转换别硬拼字符串,用
SimpleXMLElement构建:$xml = new SimpleXMLElement('<root></root>');,再用addChild()逐层写入,避免标签闭合错误 - 统一返回结构很重要:无论 JSON 还是 XML,都保持
code/msg/data三层结构,否则前端适配成本飙升 - 别在同一个接口里混用
echo和return—— 输出前必须确保 headers 未被发送,可用headers_sent()预检
为什么 var_export() 和 print_r() 绝对不能用在接口输出
这两个函数是调试用的,输出带 PHP 语法结构(如数组字面量、布尔常量 true),前端 JS JSON.parse() 会直接报错 Unexpected token。
立即学习“PHP免费学习笔记(深入)”;
-
var_export()输出类似array ( 'a' => 1 ),不是标准 JSON -
print_r()输出带缩进、括号、甚至资源 ID(如Resource id #5),完全不可解析 - 线上环境若没关掉
display_errors,PHP 错误信息也可能混在响应体里,导致 JSON 解析失败——务必在入口加ini_set('display_errors', 'Off'); - 真正需要调试时,记录到日志文件(
error_log())或用 Xdebug 断点,别让调试痕迹流到接口响应中
json_encode() 失败不检查,接口就返回空响应,前端卡死却找不到原因。



















