allOf项的属性是否可以包含$ ref到另一个allOf项定义?

时间:2018-02-07 11:19:30

标签: json jsonschema

"#/allOf/1/properties/body/properties/foo"是否有效$ ref?
正如所述in this article解释$ ref使用情况,看起来应该如此 但是,AJVhttps://www.jsonschemavalidator.net/似乎都不同意。

使用普通的JSON指针尝试它似乎是可能的:https://repl.it/repls/WretchedSpiritedMammoth

这是我正在测试的架构。

{
  "$schema": "http://json-schema.org/draft-06/schema#",
  "type": "object",
  "allOf": [
    {
      "$schema": "http://json-schema.org/draft-06/schema#",
      "$id": "http:/example.org/example.schema.json",
      "type": "object",
      "properties": {
        "type": {
          "type": "string"
        },
        "body": {
          "type": "object"
        }
      },
      "required": [
        "type",
        "body"
      ]
    },
    {
      "properties": {
        "body": {
          "$schema": "http://json-schema.org/draft-06/schema#",
          "$id": "http://example.org/foo.schema.json",
          "type": "object",
          "properties": {
            "foo": {
              "type": "number",
              "minimum": 1
            },
            "bar": {
              "$ref": "#/allOf/1/properties/body/properties/foo"
            }
          },
          "required": [
            "foo",
            "bar"
          ]
        }
      }
    }
  ]
}

编辑:这些是我得到的错误:

jsonschemavalidator.net

  

解析架构时出错   消息:解析模式引用'#/allOf/1/properties/body/properties/foo'时出错。   路径'allOf[1].properties.body.properties.bar',行..,位置..

AJV

  

无法解析来自身份http://example.org/foo.schema.json

的参考#/allOf/1/properties/body/properties/foo

1 个答案:

答案 0 :(得分:1)

虽然您已在子模式中设置了$id,但您的架构大多是正确的。

  

“$ id”关键字定义架构的URI,以及基本URI   模式中的其他URI引用将被解析。

https://tools.ietf.org/html/draft-handrews-json-schema-00#section-9.2

通过向子模式添加$id,您可以重置其他URI引用的基URI,包括在子模式及其子项中使用$ref

$ref

  

...针对当前的URI基础,它标识了一个的URI   要使用的架构。

https://tools.ietf.org/html/draft-handrews-json-schema-00#section-8

通过将bar的定义更改为以下内容,您的架构将有效。

"bar": {
  "$ref": "#/properties/foo"
}

在后来的评论中进一步编辑为Relequestual:

将绝对URI作为subschema $ id是有效的,但如上所述,它会重置基URI。对$ id值的限制仅在使用它来创建本地URI片段标识符时适用(如果这对您没有任何意义,请不要担心)。

直接从另一个属性架构引用属性架构是有效的,但更常见的最佳做法是将此类架构放在“definitions”关键字下,并让两个属性都引用该位置。这是我建议的最大限度的清晰度:

{
  "$schema": "http://json-schema.org/draft-06/schema#",
  "type": "object",
  "allOf": [
    {
      "$schema": "http://json-schema.org/draft-06/schema#",
      "$id": "http:/example.org/example.schema.json",
      "type": "object",
      "properties": {
        "type": {
          "type": "string"
        },
        "body": {
          "type": "object"
        }
      },
      "required": [
        "type",
        "body"
      ]
    },
    {
      "properties": {
        "body": {
          "$schema": "http://json-schema.org/draft-06/schema#",
          "$id": "http://example.org/foo.schema.json",
          "type": "object",
          "properties": {
            "foo": {
              "$ref": "#/definitions/whateverYouWantToCallIt"
            },
            "bar": {
              "$ref": "#/definitions/whateverYouWantToCallIt"
            }
          },
          "required": [
            "foo",
            "bar"
          ]
        }
      },
      "definitions": {
        "whateverYouWantToCallIt": {
          "type": "number",
          "minimum": 1
        }
      }
    }
  ]
}