Php Laravel验证:必须是一个带“";json";规则

Php Laravel验证:必须是一个带“";json";规则,php,json,laravel,validation,Php,Json,Laravel,Validation,我正在制作一个LaravelAPI,但我似乎无法在其中一篇文章中发送JSON数据。我检查了StackOverflow中的其他帖子,但是我的JSON请求似乎是正确的,所以我似乎找不到错误: 以下是我的控制器方法中的代码: $validator = Validator::make($request->all(), [ "name" => "required|string", "colors" => &quo

我正在制作一个LaravelAPI,但我似乎无法在其中一篇文章中发送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);
以下是请求主体:

{
 "name": "Test",
 "colors": {
   "Man": "#0000ff",
   "Second": "#FF0000"
 },
 "sizes": {
   "titles": "20px"
 }
}
错误:

{
   "errors": {
       "colors": ["The colors must be a valid JSON string."],
       "text_sizes": ["The text sizes must be a valid JSON string."]
   }
}

有什么问题吗?谢谢大家!

您需要传递一个JSON字符串,而不是JSON对象。这可以通过
json\u encode
json.stringify
实现

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

您可以在前端应用程序中使用
JSON.stringify
执行此操作,也可以使用
prepareForValidation()实现表单请求

您可以在json属性上执行
json\u encode()
。比如:

protected function prepareForValidation()
{
    $this->merge([
        'colors' => json_encode($this->colors),
        'text_sizes' => json_encode($this->text_sizes)
    ]);
}
或者在您的情况下:

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

您需要传递一个JSON字符串,而不是JSON对象。这可以通过
json\u encode
json.stringify
实现

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

您可以在前端应用程序中使用
JSON.stringify
执行此操作,也可以使用
prepareForValidation()实现表单请求

您可以在json属性上执行
json\u encode()
。比如:

protected function prepareForValidation()
{
    $this->merge([
        'colors' => json_encode($this->colors),
        'text_sizes' => json_encode($this->text_sizes)
    ]);
}
或者在您的情况下:

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

laravel有一种方便的方法来验证请求。请按照以下步骤为api发出您自己的请求和响应 1-
php工匠制作:请求您的请求

然后像这样定制您的请求
laravel有一种方便的方法来验证请求。请按照以下步骤为api发出您自己的请求和响应
1-
php工匠制作:请求您的请求

然后像这样定制您的请求
我找到了一个简单的解决方案,只需使用双引号表示json字符串,并转义json中的双引号:

{“name”:“Test”,“colors”:“{“Man\”:\“0000ff\”,“Second\”:\“FF0000\”,“size”:“{“titles\”:“20px\”}


这解决了我从rest发送json字符串的问题。

我找到了一个简单的解决方案,只需使用双引号表示json字符串,并转义json中的双引号:

{“name”:“Test”,“colors”:“{“Man\”:\“0000ff\”,“Second\”:\“FF0000\”,“size”:“{“titles\”:“20px\”}


这解决了我从rest发送json字符串的问题。

您传递的是json对象,而不是json字符串。因此,要使其工作,我认为您需要执行
JSON.parse()
。所以你会得到类似于
“\'colors\”:{\n\“Man\”:“\'0000ff\”,\n\“Second\”:“\'FF0000\”\n}”
我试过这样做:“colors:“{'Main':'0000ff','Secondary':'FF0000'”,但它不起作用。这不是一个有效的json字符串吗?不,我认为您需要使用反斜杠:“\'colors\':\'Man\':\“\'0000ff\”,“Second\”:\“\'FF0000\”)。PS我的意思当然是
JSON.stringify()
,我明白了。那么,在验证JSON字段之前,如何仅对其进行字符串化?因为在我的例子中,我只希望有两个属性是JSON数据。@Tom请在线程中做出响应,以便我可以将我的帖子标记为已回答。谢谢。您传递的是一个json对象,而不是json字符串。因此,要使其工作,我认为您需要执行
JSON.parse()
。所以你会得到类似于
“\'colors\”:{\n\“Man\”:“\'0000ff\”,\n\“Second\”:“\'FF0000\”\n}”
我试过这样做:“colors:“{'Main':'0000ff','Secondary':'FF0000'”,但它不起作用。这不是一个有效的json字符串吗?不,我认为您需要使用反斜杠:“\'colors\':\'Man\':\“\'0000ff\”,“Second\”:\“\'FF0000\”)。PS我的意思当然是
JSON.stringify()
,我明白了。那么,在验证JSON字段之前,如何仅对其进行字符串化?因为在我的例子中,我只希望有两个属性是JSON数据。@Tom请在线程中做出响应,以便我可以将我的帖子标记为已回答。谢谢。谢谢,但当我只想立即验证两个字段时,这似乎不切实际。我现在没有任何复杂的逻辑,所以我不需要做所有这些。谢谢你,但当我只想立即验证两个字段时,这似乎不切实际。我现在没有任何复杂的逻辑,所以我没有必要做所有这些。