响应 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 的数组集合。这个数组的内容是递归序列化的。
Model
中 JsonSerializable
的默认实现将尝试序列化所有模型 attributes
,但首先会尝试转换和调用属性上的所有访问器。这可能会或可能不会导致问题。无论如何,这里的解决方案是弄清楚为什么 jsonSerialize
方法中返回了一个资源,并找出隐藏它的最佳方法。通常你可以使用
隐藏属性
protected $hidden = [ 'timestamp' ];
然而从你的问题来看,答案似乎不是那么直接,所以可能需要更深入地挖掘。
编辑:
我输出了数组,@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 的数组集合。这个数组的内容是递归序列化的。
Model
中 JsonSerializable
的默认实现将尝试序列化所有模型 attributes
,但首先会尝试转换和调用属性上的所有访问器。这可能会或可能不会导致问题。无论如何,这里的解决方案是弄清楚为什么 jsonSerialize
方法中返回了一个资源,并找出隐藏它的最佳方法。通常你可以使用
protected $hidden = [ 'timestamp' ];
然而从你的问题来看,答案似乎不是那么直接,所以可能需要更深入地挖掘。