thinkphp 6 默认不解析 application/json 请求体,需调用 $request->json() 或 tp6.1+ 的 $request->withjson(true) 显式解析;$request->input() 无法直接读取 json 字段,且第三个参数不触发 json 解析。

ThinkPHP 6 的 $request->input() 默认不解析 JSON
直接用 $request->input('key') 拿不到 POST 的 JSON 字段——因为 TP6 默认只解析 application/x-www-form-urlencoded 和 multipart/form-data,对 application/json 请求体完全跳过解析,input() 返回空数组或 null。
常见错误现象:$request->input('user.name') 始终为 null,但 $request->getInputData() 能看到原始 JSON 字符串;或者用 $request->post() 也拿不到数据,因为 post() 底层仍依赖 input() 的解析结果。
- 必须手动触发 JSON 解析:在中间件或控制器开头调用
$request->withJson(true)(TP6.1+)或改写input()行为 - TP6.0 不支持
withJson(),得用$request->json(true)显式解包,返回的是think\facade\Request自带的json()方法,不是input() - 注意 Content-Type 必须严格是
application/json(不能带空格或参数,比如application/json; charset=utf-8在某些版本会失败)
用 $request->json() 替代 input() 读取顶层字段
$request->json() 是 ThinkPHP 封装的 JSON 解析入口,它会自动读取原始请求体、json_decode 并缓存结果,比反复 file_get_contents('php://input') 安全且高效。
使用场景:前端发 { "name": "张三", "tags": ["a","b"] },你想直接取 name 或遍历 tags。
-
$request->json('name')→ 取字符串值"张三" -
$request->json('tags.0')→ 支持点号路径,取"a" -
$request->json()(无参)→ 返回完整关联数组,等价于json_decode($raw, true) - 如果 JSON 格式错误,
json()返回null,不会抛异常,需自行判断
$request->input() 加第三个参数才能安全读 JSON 子字段
很多人试过 $request->input('data.name', '', 'json'),以为加了类型就能自动解析——其实不行。TP6 中 input() 的第三个参数仅控制来源(get/post/param),不负责内容解析。JSON 解析必须前置完成。
真正有效的写法是:先确保 JSON 已被加载(比如调用过 $request->json()),再用 input() 从已解析的数据里取值——但这属于“伪操作”,实际仍是走 json() 缓存。
- 错误示范:
$request->input('user.id', 0, 'json')→ 依然返回默认值 0 - 正确链式写法:
$request->json('user.id') ?: 0 - 想统一处理所有输入?重写
app/middleware/CheckJsonInput.php,在handle()里调一次$request->json(true),后续控制器里input()才可能生效(仅限 TP6.1+)
嵌套结构深取值时,json() 的点号语法有边界
点号路径看似方便,但遇到动态 key、数字索引或空格字段名就容易失效。比如 JSON 是 { "2024-report": { "score": 95 } },$request->json('2024-report.score') 会报错或返回 null。
性能影响不大,但兼容性差:点号解析基于 think\helper\Arr::get(),它内部用 explode('.', $key),不支持转义或特殊字符。
- 含连字符、点、空格的 key,必须用完整数组方式:
$data = $request->json(); $data['2024-report']['score'] - 不确定结构是否完整时,别链式调用:
$request->json('a.b.c.d')→ 任一层 null 都导致返回 null,不易定位哪层缺失 - 需要默认值且含特殊 key?封装个辅助函数:
data_get($request->json(), '["2024-report"]["score"]', 0)(用eval太危险,建议用think\helper\Arr::get()手动传数组路径)
JSON 解析本身不慢,但反复调用 json() 会重复解码——TP 内部做了缓存,只要不手动清空 Request::$json,多次调用是安全的。最常被忽略的是:没校验 Content-Type 就直接 json(),结果在表单提交时返回 null,然后整个逻辑崩掉。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











