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

Response JSON error - Type is not supported when using Eloquent

编辑:

我输出了数组,@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(),但我发现 returns 没有任何结果,因为没有结果。我已经试过 Response($user) 但它是空的。我已尝试 return Response()->json($user); 出现相同类型的不支持错误。

感谢您的帮助。

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

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

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

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

use Illuminate\Support\Facades\Response;

控制器必须是这样的:

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

请这样尝试

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

我已经在我的代码中使用它

使用 where('...')->get() returns 无法在 response()->json() 中使用的集合。 尝试使用:

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

这里只是一个打字错误,你必须用小写来写response()或者Response()因为Response是一个class,而response()是一个魔法Laravel 函数,它已经实例化了 class 响应,您可以使用它来 return 一个响应实例。

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

use Illuminate\Support\Facades\Response;

错误消息 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' ];

然而从你的问题来看,答案似乎不是那么直接,所以可能需要更深入地挖掘。