Laravel 验证:必须是符合“json”规则的有效 JSON 字符串

Ran*_*ner 4 php validation json laravel

我正在制作 Laravel API,但我似乎无法在其中一篇文章中发送 JSON 数据。我检查了 StackOverflow 中的其他帖子,但似乎我的 JSON 请求是正确的,所以我似乎找不到错误:

这是我的控制器方法中的代码:

$validator = Validator::make($request->all(), [
    "name" => "required|string",
    "colors" => "json",
     "sizes" => "json"
]);

if($validator->fails())
    return response()->json(["errors" => $validator->errors()], 400);
Run Code Online (Sandbox Code Playgroud)

这是请求正文:

{
 "name": "Test",
 "colors": {
   "Man": "#0000ff",
   "Second": "#FF0000"
 },
 "sizes": {
   "titles": "20px"
 }
}
Run Code Online (Sandbox Code Playgroud)

错误:

{
   "errors": {
       "colors": ["The colors must be a valid JSON string."],
       "text_sizes": ["The text sizes must be a valid JSON string."]
   }
}
Run Code Online (Sandbox Code Playgroud)

似乎有什么问题?谢谢你!

Tom*_*Tom 9

那么您需要传递 JSON 字符串而不是 JSON 对象。json_encode这可以通过或 来完成JSON.stringify

作为对您最后评论的回答:

您可以在前端应用程序中执行此操作JSON.stringify,也可以使用以下内容实现表单请求prepareForValidation(): https: //laravel.com/docs/8.x/validation#prepare-input-for-validation

json_encode()您可以在 json 属性上执行操作。喜欢:

protected function prepareForValidation()
{
    $this->merge([
        'colors' => json_encode($this->colors),
        'text_sizes' => json_encode($this->text_sizes)
    ]);
}
Run Code Online (Sandbox Code Playgroud)

或者在你的情况下:

$validator = Validator::make($request->merge([
        'colors' => json_encode($request->colors),
        'text_sizes' => json_encode($request->text_sizes)
    ]), [
    "name" => "required|string",
    "colors" => "json",
     "sizes" => "json"
]);
Run Code Online (Sandbox Code Playgroud)