如何使用Laravel response() - > json()返回空对象而不是空数组

时间:2018-05-01 08:25:25

标签: json laravel-5

在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()助手返回空对象而不是空数组,是否可能?

6 个答案:

答案 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);

});