响应 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 的数组集合。这个数组的内容是递归序列化的。
Model
中JsonSerializable
的默认实现将尝试序列化所有模型attributes
,但首先会尝试转换并调用属性上的所有访问器。这可能会或可能不会导致问题。无论如何,这里的解决方案是找出为什么在jsonSerialize
方法中返回了一个资源,并找出隐藏它的最佳方法。通常你可以使用隐藏属性
protected $hidden = [ 'timestamp' ];
但是从您的问题看来,答案可能并不那么直接,因此可能需要更深入地挖掘。
【讨论】:
添加 $hidden 修复了其他人拥有的大多数解决方案,我的原始解决方案也有效。以上是关于响应 JSON 错误 - 使用 Eloquent 时不支持类型的主要内容,如果未能解决你的问题,请参考以下文章
Laravel/Eloquent 规范化 JSON 响应的关系?
Laravel Vue - 在 json 响应中获得 Eloquent