有人能告诉我如何使JustinRainbow Json模式验证器能够找到参考文献。
这是我试图验证的foobar模式:
{
"title": "foobar schema",
"type": "object",
"properties": {
"pagination": {
"$ref": "#/definitions/pagination"
}
},
"required": ["pagination"]
}
分页模式的定义包含在我的计算机上的单独文件中。
尝试验证这一点,而不告诉JSON验证器如何解析这样的引用:
$uriRetriever = new JsonSchema\Uri\UriRetriever();
$refResolver = new JsonSchema\RefResolver($uriRetriever, $uriResolver);
$schema = $refResolver->resolve("file://".realpath(__DIR__."/foobar.json"));
给出错误消息:
File: file://features/foobar.json is found, but could not resolve fragment: #/definitions/pagination (JsonSchema\Exception\UnresolvableJsonPointerException)
这是公平的,因为验证器无法知道如何找到包含分页模式定义的文件....那么如何告诉RefResolver如何找到分页模式的定义?
我希望能够通过本地文件系统解析文件,而不必在网络服务器上使用URL。
答案 0 :(得分:0)
架构中使用的引用类型是json pointer,指的是架构文件的另一部分。您需要指定定义/分页属性以消除错误。
{
"title": "foobar schema",
"type": "object",
"properties": {
"pagination": {
"$ref": "#/definitions/pagination"
}
},
"required": ["pagination"],
"definitions": {
"pagination": {
}
}
}
为了引用其他文件中的定义,您可以编写如下内容:
"pagination": {
"$ref": "pagination.schema.json#"
}
甚至可以在外部文件中指定特定节点:
"pagination": {
"$ref": "external_definitions.schema.json#/definitions/pagination"
}
应在与包含引用的架构相同的文件夹中查找external_definitions.schema.json
/ pagination.schema.json
。该库还应提供一些api来配置此查找。
在我的项目中,我使用JustinRainbow JsonValidator for php。它不允许提供自定义解析程序,但引用文件搜索的位置可能会受到架构中“id”值的影响。
示例,main.schema.json
中的架构:
{
"id": "http://myweb.com/schemas/main.schema.json#",
"title": "foobar schema",
"type": "object",
"properties": {
"pagination": {
"$ref": "pagination.schema.json#"
}
},
"required": ["pagination"]
}
验证此架构时,验证程序尝试使用以下命令加载pagination.schema.json:
php_get_contents('http://myweb.com/schemas/pagination.schema.json');