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

12

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


可能是如何在PHP中定义空对象的重复问题。 - DrNio
@DrNio 不是同样的问题。看看我的代码,已经定义了一个数据对象,但问题是使用 response() -> json() 总是返回空数组。 - kingshark
1
嗯,你的第一个变量也应该可以,因为默认情况下它使用json_encode。除非你的ResponseFactory没有返回默认的JsonResponse。你能试试这个吗:return response()->json($data, 200, [], JSON_FORCE_OBJECT); - vstm
6个回答

15

这个有效:

return response()->json(new stdClass());

5

这适用于 Laravel 5.6

Route::get('/test2', function (){
    $data = (object) [];

    return response()->json($data, 200, [], JSON_FORCE_OBJECT);

});

这个在Laravel 9中也适用,并且应该被接受作为答案。 使用门面:Response::json([], options: JSON_FORCE_OBJECT); - undefined

4
< p>再举一个例子,取材自Hamid Mohayeji的回答:

return \response()->json(null);

无需实例化stdClass(尽管需要内存分配)。


2
使用dingo/api会修改空数组的响应,就像@kingshark所说的那样,但是您可以在不停用dingo或修改除自己响应之外的任何内容的情况下使其正常工作。
Dingo期望$data已经编码为json,因此如果您这样做:
$data = ['message' => 'Lorem Ipsum', 
         'errors' => []];
return response()->json($data);

Will get:

{
    "message": "Lorem Ipsum",
    "errors": []
}

但是如果您这样做:

$data = ['message' => 'Lorem Ipsum', 
         'errors' => []];
$data = json_encode($data, JSON_FORCE_OBJECT);
return response()->json($data);

您将获得:

{
    "message": "Lorem Ipsum",
    "errors": {}
}

我得到的是"{}"而不是{}。有什么想法吗? - Blues Clues

1
当您返回response()->json($data)时,它会返回一个JsonResponse对象,其中包括$datadata字段中。因此,当您收到此响应时,您将以相同的格式(对象)获取数据。

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 ]] )


-1
感谢大家,我终于找到了问题所在:dingo/api

如果我在使用dingo/api包的应用程序中使用response()->json($data),则会有不同的响应处理过程。在某个时刻,它将通过\Dingo\Api\Http\Response::makeFromJson方法进行解码响应内容,然后创建一个新的响应实例,这将把{}更改为[]

如果我删除或不使用dingo/api包,则response()->json()可以正常工作,至少在Laravel 5.5中是如此。

dingo/api覆盖、更改和扩展了大量Laravel内置类和整个请求生命周期中的方法,从路由到响应再到异常处理。


这在 Laravel 8 中不起作用。结果仍然是空数组,而不是对象。有效的解决方案是像 Tarasovych 上面回答的那样使用空的 stdClass。 - Miloslav Milo Janoušek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接