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 作为第二个参数,它也不会起作用,架构必须是对象而不是数组!
现在一切对我来说都很有魅力 ;)
此致,
我今天发现 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 作为第二个参数,它也不会起作用,架构必须是对象而不是数组!
现在一切对我来说都很有魅力 ;)
此致,