响应 JSON 错误 - 使用 Eloquent 时不支持类型

Posted

技术标签:

【中文标题】响应 JSON 错误 - 使用 Eloquent 时不支持类型【英文标题】:Response JSON error - Type is not supported when using Eloquent 【发布时间】:2021-11-27 21:10:50 【问题描述】:

编辑:

我输出了数组,@apokryfos 提到了一些关于资源无法序列化的问题。

以下是一些调试输出的外观:(删除了一些更敏感的信息) Stream in Timestamp 这是我的时间戳导致问题。如果我这样做了

unset($user["timestamp"]);

然后几乎每个人的解决方案都有效。所以,真正的原因是资源在我的时间戳中。我该如何停止或修复它?我试着做

 public $timestamps = false;

这没有任何变化。

我已经阅读了文档和一些教程。可悲的是,我似乎找不到任何关于返回什么以及使用 Eloquent 时可以使用哪些函数的文档。也许我只是想念它。

但是,我在我的控制器中使用此代码。

public function find($userName)
    $user = UserSecurity::where('userName', $userName)->get();
    //dd($user);
    return Response()->json(['data' => $user], 200);

这是我的路由器代码。

$router->get('/UserSecurity/find/userName', ['uses'=>'UserSecurityController@find']);

我知道它正在从数据库中提取正确的数据,就像我取消注释 dd($user) 我可以在屏幕上看到它一样。但是,如果我尝试通过Response()->json(..) 发送响应,则会出现此屏幕失败。 Image of Exception

我知道我可能错误地使用了 Response(),但实际上我尝试了许多不同的方法。有些只是显示空响应,有些则类似地崩溃。

我已经尝试删除 get() ,因为没有结果,所以我发现它什么也没返回。我试过Response($user),它是空的。我已经尝试return Response()->json($user); 出现相同类型的不支持错误。

感谢您的帮助。

编辑: 更改一些代码进行测试。我改成了这个

public function find($userName)
    $user = UserSecurity::where('userName', $userName)->get()->toJson();
    $user = json_encode($user);
    return Response($user);

这将返回 false 。我不确定布尔值来自哪里。原来的 dd($user) 实际上有来自数据库的正确信息,所以我知道它的查询是正确的。

【问题讨论】:

我认为这是因为不可能将所有响应作为 json 返回,因为响应包含的标头与 json 模式不匹配。如果是这种情况,请尝试从响应中删除标头。 要调试这个做$user->map->jsonSerialize()->dd() 并检查是否有任何不能序列化为 JSON 的值,例如资源(出于任何原因) @apokryfos 哇,好吧,我刚刚发现它确实有一个流资源。这可能是问题吗?我会在等待回复时测试一些东西。 是的 php 不能 JSON 序列化系统资源。奇怪的是,模型在其 jsonSerialize 方法中开始使用它,如果您有创建资源的访问器,那么可能通过 $hidden 将它们从 jsonSerialize 中排除 @apokryfos 如果您可以将其作为答案,我可以选择它。那解决了它。谢谢! 【参考方案1】:

我认为您必须在控制器顶部添加以下内容:

use Illuminate\Support\Facades\Response;

控制器必须是这样的:

public function find($userName)
    $user = UserSecurity::where('userName', $userName)->get();
    return Response::json($user, 200);

【讨论】:

我做了这个改变。我现在收到此错误Error encoding model [App\UserSecurity] with ID [16652] to JSON: Type is not supported【参考方案2】:

请这样尝试

return response()->json(['status' => true, 'data' => $user],200);

我已经在我的代码中使用了这个

【讨论】:

同样的错误。 不支持类型 但是堆栈跟踪有这个。 ResponseFactory->json(array('status' => true, 'data' => object(Collection) 这告诉我这是一个集合,尽管我尝试了另一种修复方法,我们将其更改为数组。这也没有用。【参考方案3】:

使用where('...')->get() 会返回一个不能在response()->json() 中使用的集合。 尝试使用:

public function find($userName)
    $user = UserSecurity::where('userName', $userName)->first();
    return response()->json(['data' => $user->toArray()], 200);

【讨论】:

我做了这个改变,我有同样的错误。我确实注意到这看起来很奇怪。 ResponseFactory->json(array('data' => array(array('usersecurityid' => 111... 看起来很奇怪的输入 array(array(array( 有没有关于这些的任何信息以及它们的输入需要什么?【参考方案4】:

这里只是一个拼写错误,你必须用小写字母写response()Response(),因为 Response 是一个类,而 response() 是一个神奇的 Laravel 函数,它已经实例化了类 Response,你可以使用返回一个响应实例。

【讨论】:

感谢您的意见。我试过了。它没有改变,但我确实会记住这一点。【参考方案5】:

我认为您必须在控制器顶部添加以下内容 那么这段代码会对你有所帮助。

use Illuminate\Support\Facades\Response;

【讨论】:

添加没有直接改变。我确实将Response->json 更改为Response::json 以尝试使用该响应类。我现在有这个错误。 Error encoding model [App\UserSecurity] with ID [16652] to JSON: Type is not supported【参考方案6】:

错误消息Type is not supported 实际上来自 PHP 的 JSON 序列化程序。只有极少数类型是 PHP 无法序列化的,而在您的特定情况下似乎导致问题的类型是流资源。

为了检查模型中实际序列化的内容,您需要调用:

$user = UserSecurity::where('userName', $userName)->get();
$user->map->jsonSerialize()->dd();

jsonSerialize 存在是因为所有 Laravel 模型都实现了JsonSerializable 接口。

这将转储 PHP 将尝试序列化为 JSON 的数组集合。这个数组的内容是递归序列化的。

ModelJsonSerializable 的默认实现将尝试序列化所有模型attributes,但首先会尝试转换并调用属性上的所有访问器。这可能会或可能不会导致问题。无论如何,这里的解决方案是找出为什么在jsonSerialize 方法中返回了一个资源,并找出隐藏它的最佳方法。通常你可以使用隐藏属性

protected $hidden = [ 'timestamp' ];

但是从您的问题看来,答案可能并不那么直接,因此可能需要更深入地挖掘。

【讨论】:

添加 $hidden 修复了其他人拥有的大多数解决方案,我的原始解决方案也有效。

以上是关于响应 JSON 错误 - 使用 Eloquent 时不支持类型的主要内容,如果未能解决你的问题,请参考以下文章

以 json 格式返回 eloquent 集合

Laravel/Eloquent 规范化 JSON 响应的关系?

Laravel Vue - 在 json 响应中获得 Eloquent

使用 Twig 生成纯 JSON 响应是不是合适?

JSON Web Token 仅适用于具有 Eloquent 模型的 Laravel

在 Laravel json 响应中使用访问器和修改器