PHP将JSON字符串转数组需用json_decode($str, true)并检查json_last_error(),数据库数组转JSON要统一UTF-8编码、过滤不可序列化值并设置header,字段映射宜用配置表+循环,禁用var_export/serialize跨系统传输。

PHP后台怎么把JSON字符串转成数组
绝大多数接口请求或前端传参都用JSON,PHP后端必须先解析才能处理。别直接json_decode($str)就完事——漏掉第二个参数会返回对象,后续用$arr['key']会报错。
- 务必加
true:json_decode($json_str, true),否则得到的是stdClass对象,不能用方括号取值 - 检查是否失败:
if (json_last_error() !== JSON_ERROR_NONE) { /* 处理错误 */ },空字符串、中文乱码、多余逗号都会导致解析失败 - 注意编码:输入必须是UTF-8,GB2312或GBK的JSON字符串要先
mb_convert_encoding($str, 'UTF-8', 'GBK')
PHP怎么把数据库查出的关联数组转成JSON响应
MySQLi或PDO查出来的结果默认就是关联数组(比如fetch_assoc()),但直接echo json_encode($data)可能出乱码或null——常见于字段含中文、时间戳、资源类型(如mysqli_result)。
- 统一字符集:连接数据库时指定
charset=utf8mb4,例如PDO DSN里加;charset=utf8mb4 - 过滤不可序列化值:时间字段用
date('Y-m-d H:i:s', strtotime($row['created_at']))再赋值;避免直接传DateTime对象 - 设置Header:输出前加
header('Content-Type: application/json; charset=utf-8');,否则前端response.json()可能解析失败
PHP后台做字段映射(比如把数据库字段名转成API字段名)
数据库字段叫user_name,API要求返回username;或者把status数字转成active/inactive字符串——硬写$api['username'] = $db['user_name']太容易漏、难维护。
- 用映射表+循环:定义
$map = ['user_name' => 'username', 'status' => 'status_text'],再遍历赋值 - 状态转换建议封装函数:
function formatStatus($n) { return [0=>'inactive', 1=>'active'][$n] ?? 'unknown'; },避免到处写三元 - 别在循环里反复调用
json_encode或date(),先转换字段,最后统一encode
为什么var_export()和serialize()不能当数据转换用
看到有人用var_export($arr, true)生成字符串存日志,或用serialize()传给前端——这是严重误用。前者是PHP调试专用格式,后者是PHP私有序列化,其他语言根本没法解析。
立即学习“PHP免费学习笔记(深入)”;
-
var_export()输出带array(和单引号,不是标准JSON,前端JSON.parse()直接报错 -
serialize()结果含字母+冒号+长度标记(如s:5:"hello"),JavaScript、Python完全不认 - 跨系统传输只认
json_encode(),且必须确保所有值都是标量、数组或NULL;对象要先get_object_vars()转成数组
字段类型混杂、编码没统一、忽略json_last_error()——这三处出问题的概率远高于语法错误。实际项目里,宁可多写两行判断,也别赌“应该没问题”。



















