如何使用 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)

Laravel Response::download() 函数图片问题

Laravel5.1 响应--Response

Laravel Response::download 在使用 URL::to 时抛出 FileNotFoundException 异常

response()->json 无法在 Laravel 中解码 [关闭]

Laravel json 响应:response()->json() 或 $var->toJson()