php json_encode() 返回多字段json需用关联数组或stdclass,索引数组会生成json数组[]而非对象{};须设utf-8 header、避免额外输出,中文用json_unescaped_unicode可原样显示。

PHP json_encode() 默认只支持关联数组和对象
PHP 返回多字段 JSON,本质是把含多个键值对的结构序列化成字符串。关键不是“怎么加字段”,而是“用什么数据结构装字段”——json_encode() 对索引数组(数字键)和关联数组(字符串键)行为不同:前者生成 JSON 数组 [],后者生成 JSON 对象 {}。接口返回多字段数据,99% 场景要的是对象,所以必须用关联数组或 stdClass 实例。
- 错误写法:
$data = ['name', 'age'];→ 得到["name","age"](JSON 数组,无字段名) - 正确写法:
$data = ['name' => '张三', 'age' => 28, 'city' => '杭州'];→ 得到{"name":"张三","age":28,"city":"杭州"} - 如果字段名来自变量,用双引号+花括号拼接:
$key = 'status'; $data[$key] = 'success';
中文乱码、特殊字符没转义?检查输入数据和 header
json_encode() 默认不处理中文,原始字符串含中文时会直接输出 Unicode 编码(如 "\u4f60\u597d"),前端解析后能显示但看着费劲;更常见的是直接输出乱码,那是 PHP 文件编码或输出未声明导致的。
- 确保 PHP 文件保存为 UTF-8 无 BOM 格式(编辑器里可设)
- 发送前加
header('Content-Type: application/json; charset=utf-8');,否则浏览器可能按 ISO-8859-1 解析 - 想让中文原样输出(非 Unicode),加
JSON_UNESCAPED_UNICODE参数:json_encode($data, JSON_UNESCAPED_UNICODE) - 注意:
JSON_UNESCAPED_UNICODE在 PHP 5.4+ 才支持,老环境只能接受 \uXXXX 形式
空值、null、0、false 被忽略?其实是正常行为
json_encode() 不会报错,也不会跳过字段,但某些值在 JSON 中有明确含义:null 就是 null,false 是布尔值 false,0 是数字 0。真正容易出问题的是 PHP 的 null 值被当成“空”而漏传——比如数据库查不到记录,字段是 null,json_encode() 仍会输出 "field": null,但前端 JS 可能误判为未定义。
- 若需统一转为空字符串,手动处理:
$data['remark'] = $row['remark'] ?? ''; - 若字段可选,且不想出现在 JSON 中,用
unset($data['optional_field'])显式删除 - 避免用
empty()判断后直接跳过赋值——0、"0"、false都会被当成空,导致数值型字段丢失
返回前别忘了 exit 或 die,否则可能混入额外输出
很多 PHP 脚本在 json_encode() 后没终止执行,后面还有 echo、HTML、或者被 include 的其他文件输出了空白符或错误信息,结果 JSON 前后夹杂垃圾内容,前端 JSON.parse() 直接报 Unexpected token。
立即学习“PHP免费学习笔记(深入)”;
- 最稳妥做法:
echo json_encode($data, JSON_UNESCAPED_UNICODE); exit; - 如果用了框架或路由,确认是否已拦截后续输出(如 Laravel 的
response()->json()自动处理) - 调试时用
var_dump($data)看结构,但上线前必须删掉,否则破坏 JSON 格式 - 开启
display_errors = Off(生产环境),防止 PHP 错误信息混进响应体
多字段 JSON 看似简单,真正卡住人的往往不是语法,而是 header 没设、文件编码不对、或者输出被意外截断——这些地方一错,前端拿到的就是一段无法解析的“假 JSON”。











