在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()
助手返回空对象而不是空数组,是否可能?
答案 0 :(得分:1)
这在Laravel 5.8中有效:
return response()->json(new stdClass());
答案 1 :(得分:0)
当您返回response()->json($data)
时,它会返回JsonResponse
个对象,该对象在$data
字段中包含data
。因此,当您收到此响应时,您将获得具有相同格式(对象)的数据。
JsonResponse json(string | array $ data = [],int $ status = 200,array $ headers = [],int $ options)
当您返回json_encode($data)
时,它将解析$data
并返回一个字符串:"{}"
。只有当您解码"{}"
时,它才会再次成为对象。
string json_encode(mixed $ value [,int $ options = 0 [,int $ depth = 512]])
答案 2 :(得分:0)
谢谢大家,最后我发现了问题: dingo/api
。
如果我使用dingo/api
包在app中使用response() - > json($ data),则会有不同的响应处理过程。在某些时候,它会通过\Dingo\Api\Http\Response::makeFromJson
方法解码响应内容,然后创建一个新的响应实例,将{}
更改为[]
。
如果我删除或不使用dingo/api
包,则response() - > json()可以正常工作,至少在Laravel 5.5中。
dingo / api覆盖,更改和扩展大量的laravel内置类,并在整个请求生命周期中进行处理,从路由到响应再到异常处理。
答案 3 :(得分:0)
使用dingo / api就像@kingshark所说的那样修改空数组的答案,但是您可以在不停止使用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 :(得分:0)
又一个例子,灵感来自Hamid Mohayeji答案:
return \response()->json(null);
无需实例化stdClass
(尽管有内存分配)。
答案 5 :(得分:0)
这适用于 Laravel 5.6
Route::get('/test2', function (){
$data = (object) [];
return response()->json($data, 200, [], JSON_FORCE_OBJECT);
});