JSON Schema:忽略所需的属性

时间:2016-08-19 15:06:58

标签: php json jsonschema json-schema-validator

我今天发现了JSON Schema,它看起来100%符合我的需求,但它实际上让我疯了一个最基本的案例。在创建这篇文章之前,我显然是尽力遵循现有的文档并在互联网上寻找帮助的东西。

Stack: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");

但是这段代码继续打印“好”......我肯定错过了一些关于JSON Schema的东西。

感谢您的帮助,最好的问候。

2 个答案:

答案 0 :(得分:2)

我终于让它工作了,经过一步一步的调试我正在使用的JSON Schema的实现:

首先,我自己加载了JSON Schema,Github repo中给出的示例看起来对我来说是打破的(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函数中的注释行,如果你使用带有true的json_decode作为第二个参数它也不会工作,那么模式必须是一个对象而不是一个数组!

现在一切都像我的魅力一样;)

致以最诚挚的问候,

答案 1 :(得分:0)

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