2016-08-19 116 views
1

今天我发现了JSON Schema,它看上去完全符合我的需求,但它实际上让我对最基本的案例之一感到疯狂。在创建这篇文章之前,我显然已经尽力遵循现有的文档,并在互联网上寻找帮助的东西。JSON Schema:忽略必需的属性

堆栈:PHP7 - justinrainbow/JSON-模式2.0.5

这里是架构:

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

正如你可以看到我使用要求两者定义(布尔和数组),只是确保我使用的是好的,我也只用数组和布尔值来尝试,结果相同。

下面是数据

{ 
    "login":"[email protected]" 
} 

我期待下面的代码来检测缺乏必要的idAsc参数。

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

但这个代码保持打印“好” ......我肯定失去了一些东西有关JSON模式。

感谢的对你有所帮助,最好的问候。

+0

http://json-schema.org/implementations.html列出了5种不同的JSON模式验证了PHP。你在使用哪一个? – Barmar

+0

@Barmar你可以在我的“堆栈”部分找到它:实际上使用justinrainbow/json-schema - > https://github.com/justinrainbow/json-schema –

回答

2

我终于搞定了,经过一步一步的调试,我一直在执行JSON Schema我用的是:

首先,我装了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与真正的第二个参数,它不会来工作,模式必须是一个对象,而不是一个数组!

现在一切工作对我来说就像魅力;)

最好的问候,

+1

我决定为图书馆的业主创建一张门票以询问更多详情: https://github.com/justinrainbow/json-schema/issues/299 –

0

这似乎是验证的问题这个验证一定会失败,你可以尝试一下其他的实现

+0

今天早上这将是我的一项任务,但对我来说似乎很奇怪......根据Github上的贡献者数量,我使用了最流行的实现。 –

+0

如果从属性定义中删除'“required”:true'属性,会发生什么情况?该属性不违反模式规范,但也没有任何作用,但仍然导致模式impl的意外行为。我会放弃它。 – erosb

+0

我甚至在创建这篇文章之前就试过了,但你说的没错,这不是下面的JSON Schema定义的第4版。我终于解决了这个问题,随时阅读我的​​最后一篇文章,在那里我解释了一下我做了什么来实现它。 –