如何在 JustinRainbow JsonValidator 中使用引用

Dan*_*ack 5 php jsonschema

有人可以告诉我如何让 JustinRainbow Json 模式验证器能够找到引用。

这是我试图验证的 foobar 模式:

{
  "title": "foobar schema",
  "type": "object",
  "properties": {
    "pagination": {
       "$ref": "#/definitions/pagination"
    }
  },
  "required": ["pagination"]
}
Run Code Online (Sandbox Code Playgroud)

分页模式的定义包含在我计算机上的一个单独文件中。

尝试验证它而不告诉 JSON 验证器如何解析这样的引用:

$uriRetriever = new JsonSchema\Uri\UriRetriever();
$refResolver = new JsonSchema\RefResolver($uriRetriever, $uriResolver);
$schema = $refResolver->resolve("file://".realpath(__DIR__."/foobar.json"));
Run Code Online (Sandbox Code Playgroud)

给出错误信息:

File: file://features/foobar.json is found, but could not resolve fragment: #/definitions/pagination (JsonSchema\Exception\UnresolvableJsonPointerException)
Run Code Online (Sandbox Code Playgroud)

这是公平的,因为验证器无法知道如何找到包含分页模式定义的文件......那么我如何告诉 RefResolver 如何找到分页模式的定义?

我希望能够通过本地文件系统解析文件,而不必在网络服务器上使用 URL。

Dav*_* L. 2

模式中使用的引用类型是引用模式文件另一部分的json 指针。您需要指定定义/分页属性来消除错误。

{
  "title": "foobar schema",
  "type": "object",
  "properties": {
    "pagination": {
       "$ref": "#/definitions/pagination"
    }
  },
  "required": ["pagination"],
  "definitions": {
        "pagination": {
       
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

为了引用其他文件中的定义,您可以编写如下内容:

"pagination": {
  "$ref": "pagination.schema.json#"
}
Run Code Online (Sandbox Code Playgroud)

或者甚至在外部文件中指定特定节点:

"pagination": {
  "$ref": "external_definitions.schema.json#/definitions/pagination"
}
Run Code Online (Sandbox Code Playgroud)

external_definitions.schema.json应在pagination.schema.json与包含引用的架构相同的文件夹中查找/ 。该库还应该提供一些 api 来配置此查找。

在我的项目中,我将 JustinRainbow JsonValidator 用于 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"]
}
Run Code Online (Sandbox Code Playgroud)

验证此架构时,验证器尝试使用以下方式加载 pagination.schema.json:

php_get_contents('http://myweb.com/schemas/pagination.schema.json');
Run Code Online (Sandbox Code Playgroud)