1

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

堆栈: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 的东西。

谢谢你的帮助,最好的问候。

4

2 回答 2

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 它也不起作用,架构必须是一个对象而不是一个数组!

现在一切都对我来说就像一个魅力;)

此致,

于 2016-08-22T08:52:25.107 回答
0

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

于 2016-08-19T22:02:42.617 回答