JSON 架构:忽略了必需的属性

JSON Schema : required properties ignored

我今天发现 JSON Schema 它看起来 100% 满足我的需求,但它实际上让我对最基本的情况之一感到抓狂。在创建此 post 之前,我显然已尽最大努力遵循现有文档并在互联网上寻找有用的东西。

堆栈:PHP7 - justinrainbow/json-schema 2.0.5

这是架构:

{
   "description":"UserCreate",
   "type":"object",
   "properties":{
      "login":{
         "type":"string",
         "required":true
      },
      "idAsc":{
         "type":"string",
         "required":true
      }
   },
   "required":[
      "login",
      "idAsc"
   ]
}

如您所见,我同时使用了所需的定义(布尔值和数组),只是为了确保我使用的是好的定义,我也尝试仅使用数组和/或布尔值,结果相同。

这是数据

{
   "login":"email@email.com"
}

我期待以下代码检测是否缺少所需的 idAsc 参数。

$validator = new JsonSchema\Validator;
$validator->check($data, $schema);
if ($validator->isValid() == false)
    echo("Missing something");
else
    echo("Good");

但是这段代码一直在打印“Good”……我肯定遗漏了一些关于 JSON Schema 的东西。

感谢您的帮助,此致。

这似乎是您使用的验证器实现的问题。此验证必须失败。您可以尝试使用其他实现。

在逐步调试我使用的 JSON 模式的实现后,我终于让它工作了:

首先,我自己加载了 JSON 架构,Github 存储库中给出的示例对我来说似乎是错误的 (https://github.com/justinrainbow/json-schema):

$data = json_decode(file_get_contents('data.json'));

// Validate
$validator = new JsonSchema\Validator;
$validator->check($data, (object)['$ref' => 'file://' . realpath('schema.json')]);

在逐步调试过程中,我找不到任何对 file_get_contents 或库内亲戚的调用。出于这个原因,我决定自己加载模式而不是给它的路径:

function getSchema($filePath) {
   // NOT WORKING -> return json_decode(file_get_contents($filePath), true);
   return json_decode(file_get_contents($filePath));
}

$data = json_decode($rest->getRequest()->getBody());
$schema = $this->getSchema(realpath('controllers/schemas/userCreate.json'));

$validator = new JsonSchema\Validator;
$check_return = $validator->check($data, $schema);

请注意 getSchema 函数中的注释行,如果您使用 json_decode 并将 true 作为第二个参数,它也不会起作用,架构必须是对象而不是数组!

现在一切对我来说都很有魅力 ;)

此致,