如何使用 Laravel response()->json() 返回空对象而不是空数组
Posted
技术标签:
【中文标题】如何使用 Laravel response()->json() 返回空对象而不是空数组【英文标题】:How to use Laravel response()->json() to return empty object instead of empty array 【发布时间】:2018-10-11 07:26:59 【问题描述】:在 Laravel 5.5 中
Route::get('/test2', function ()
$data = (object) [];
return response()->json($data);
);
它总是返回[]
而不是。
另一个代码:
Route::get('/test2', function ()
$data = (object) [];
return json_encode($data);
);
它正确返回
我想使用response()->json()
helper 返回空对象而不是空数组,可以吗?
【问题讨论】:
How to define an empty object in php的可能重复 @DrNio 不是同一个问题。看我的代码,已经定义了一个对象数据,但问题是使用 response() -> json() 总是为数据返回空数组。 嗯,您的第一个变体也应该没问题,因为默认情况下它使用json_encode
。除非您的 ResponseFactory
不返回默认的 JsonResponse
。你可以试试这个:return response()->json($data, 200, [], JSON_FORCE_OBJECT);
【参考方案1】:
当您返回response()->json($data)
时,它会返回一个JsonResponse
对象,该对象在data
字段中包含$data
。因此,当您收到此响应时,您将获得具有相同格式(对象)的数据。
JsonResponse json(string|array $data = [], int $status = 200, 数组 $headers = [], int $options)
当你返回json_encode($data)
时,它会解析$data
并返回一个字符串:""
。只有解码""
,它才会再次成为对象。
字符串 json_encode ( 混合 $value [, int $options = 0 [, int $depth = 第512章
【讨论】:
【参考方案2】:谢谢大家,终于找到问题了:dingo/api
。
如果我在使用dingo/api
包的应用程序中使用 response()->json($data),则会有不同的响应处理过程。在某些时候,它会通过\Dingo\Api\Http\Response::makeFromJson
方法解码响应内容,然后创建一个新的响应实例,将更改为
[]
。
如果我删除或不使用 dingo/api
包,response()->json() 可以正常工作,至少在 Laravel 5.5 中。
dingo/api 在从路由到响应到异常处理的整个请求生命周期中覆盖、更改和扩展大量 laravel 内置类和方法。
【讨论】:
【参考方案3】:正如@kingshark 所说,使用 dingo/api 会修改空数组的答案,但您可以在不停止使用 dingo 或修改除您自己的响应之外的任何其他内容的情况下完成这项工作。
Dingo 期望 $data 已经编码为 json,所以,如果你这样做:
$data = ['message' => 'Lorem Ipsum',
'errors' => []];
return response()->json($data);
将获得:
"message": "Lorem Ipsum",
"errors": []
但如果你这样做:
$data = ['message' => 'Lorem Ipsum',
'errors' => []];
$data = json_encode($data, JSON_FORCE_OBJECT);
return response()->json($data);
你会得到:
"message": "Lorem Ipsum",
"errors":
【讨论】:
我得到的是“”而不是只有 。有什么想法吗?【参考方案4】:这行得通:
return response()->json(new stdClass());
【讨论】:
【参考方案5】:另一个例子,灵感来自 Hamid Mohayeji 的回答:
return \response()->json(null);
无需实例化stdClass
(虽然是内存分配)。
【讨论】:
【参考方案6】:这适用于 Laravel 5.6
Route::get('/test2', function ()
$data = (object) [];
return response()->json($data, 200, [], JSON_FORCE_OBJECT);
);
【讨论】:
以上是关于如何使用 Laravel response()->json() 返回空对象而不是空数组的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Response::download() 函数图片问题
Laravel Response::download 在使用 URL::to 时抛出 FileNotFoundException 异常