首页 > 解决方案 > 将组合架构用作父架构时:无法解析架构引用“#foo”。路径'not.allOf[0]'

问题描述

考虑https://github.com/json-schema-org/JSON-Schema-Test-Suite/blob/master/tests/draft6/ref.json#L414中的一个示例

原始架构是:

{
      "allOf": [{
           "$ref": "http://localhost:1234/bar#foo"
       }],
       "definitions": {
            "A": {
                "$id": "http://localhost:1234/bar#foo",
                "type": "integer"
             }
       }
}

这是有效的。

对于这个模式 S,如果我想通过在这个模式之外添加一个组合模式来创建一个新模式,比如:{"not":S},即:

{
     "not": {
         "allOf": [{
              "$ref": "http://localhost:1234/bar#foo"
          }],
          "definitions": {
               "A": {
                   "$id": "http://localhost:1234/bar#foo",
                   "type": "integer"
                }
          }
      }
}

使用具有绝对 URI 的与位置无关的标识符,也使用$id. 但它是无效的。

错误消息(使用https://www.jsonschemavalidator.net/):

Error parsing schema
Message:
Error when resolving schema reference 'http://localhost:1234/bar#foo'. Path 'not.allOf[0]', line 3, position 20.

一个类似的例子是:

{
    "not": {
         "allOf": [{
               "$ref": "#foo"
          }],
          "definitions": {
                "A": {
                     "$id": "#foo",
                     "type": "integer"
                }
           }
     }
}

与位置无关的标识符,也是无效的。

$ref如果同时存在并且添加父模式后,我无法弄清楚为什么它是无效$id的......

这里{"not":S}只是一种可能,也可以考虑{"anyOf":[{S}]}

我知道它$id声明了一个基础 URI,$ref URI-references 是根据它解析的。

但是上述模式有什么问题?我应该如何纠正它们?

如果有人帮助我,我将不胜感激...

标签: jsonjson.netjsonschemaref

解决方案


你在这里是正确的,你的架构是正确的。我将其称为实现中的错误。

您的架构适用于 JSON Schema draft-07,但不适用于 JSON Schema 草稿2019-09或更高版本。对于2019-09及以上,您的$id值不能包含非空片段。

您可以在另一个基于 Web 的验证器(HyperJump 验证器的基于 Web 的版本)上看到正确和有效的行为:https ://json-schema.hyperjump.io

$schema此基于 Web 的实现默认为最新(2020-12),但您可以使用(例如)指定草稿版本"$schema": "http://json-schema.org/draft-07/schema#"

要在 HyperJump 上查看此功能,请修改您的架构以删除标识符 URI 中的片段,或者指定您正在使用draft-07.


推荐阅读