CodeIgniter 4 中 getJSON() 仅在请求头 Content-Type: application/json 且 JSON 合法时返回解析数据,否则返回 null;需用 $request->is('json') 或手动校验 header,传 true 参数可得关联数组,错误时应结合 json_last_error() 排查。

直接用 getJSON(),但得先确认请求是 JSON 类型
CodeIgniter 4 不会自动把所有 POST 请求都当 JSON 解析,getJSON() 只在 Content-Type 是 application/json 且请求体合法时才返回解析后的数据。如果前端发的是普通表单(application/x-www-form-urlencoded)或没设 header,getJSON() 返回 null 或空对象。
- 先检查是否真为 JSON 请求:
$request->is('json')或手动验证$request->getHeaderLine('Content-Type') === 'application/json' -
getJSON()默认返回stdClass对象;传true参数可转成关联数组:$request->getJSON(true) - 若 JSON 格式错误(如多逗号、单引号),
getJSON()静默失败,返回null—— 建议配合json_last_error()排查
getVar() 能不能代替 getJSON()?
可以,但行为不同。getVar() 是“智能兜底”方法:它按顺序尝试从 $_GET、$_POST、application/json 请求体中取值,最后 fallback 到 php://input。这意味着:
- 如果同时有 GET 参数
?id=123和 JSON body{"id":456},$request->getVar('id')返回的是123(GET 优先) - 它不校验 JSON 合法性,也不会报错;若 JSON 解析失败,它就跳过那一层,继续查 POST/GET
- 适合快速兼容多种输入方式,但不适合强契约 API 场景——你得明确知道数据来源
手动读取原始 JSON 并解码的场景
当 getJSON() 返回 null 但你确信请求体有内容时,说明 CI4 的自动识别逻辑没生效。这时应绕过封装,直读原始流:
- 用
file_get_contents('php://input')获取原始字节(注意:不能重复读,且$_POST已被填充时该流可能为空) - 手动
json_decode($raw, true),并检查json_last_error()是否为JSON_ERROR_NONE - 常见坑:
php://input在enctype="multipart/form-data"下不可用;上传文件时 JSON body 会被丢弃
为什么有时候 getJSON() 总是 null?
不是代码问题,大概率是客户端或中间件干扰:
- 前端 fetch 没设
headers: {'Content-Type': 'application/json'} - Nginx/Apache 代理重写了 header,比如删掉了
Content-Type或改成text/plain - CI4 配置里
$config->negotiate = false(默认 true),关闭后会跳过 MIME 类型协商,is('json')失效 - PHP 的
always_populate_raw_post_data已废弃,别依赖它;确保enable_post_data_reading = On(php.ini)
真正难调试的点往往不在控制器里,而在请求发出那一刻的 header 和代理链路——建议用 curl -v 或浏览器 Network 面板确认原始请求头是否完整到达 PHP。











