将附加约束应用于 JSON 架构中的引用定义

Apply addtional constraints to a refered definition in JSON schema

我在架构中定义了一个validType,其中每个属性都应该有textannotation

我想添加额外的约束来细化 coursetext 必须遵循 "pattern":"[a-z]{2}[0-9]{2}"。有什么方法可以直接应用约束而无需复制和粘贴 validType?

的内容

架构:

{
    "type": "object",
    "definition": {
        "validType": {
            "description": "a self-defined type, can be complicated",
            "type": "object",
            "properties": {
                "text": {
                    "type": "string"
                },
                "annotation": {
                    "type": "string"
                }
            }
        },
        "properties": {
            "name": {
                "$ref": "#/definitions/validType"
            },
            "course": {
                "$ref": "#/definitions/validType"
            }
        }
    }
}

数据:

{"name":{
    "text":"example1",
    "annotation":"example1Notes"},
 "course":{
    "text":"example2",
    "annotation":"example2Notes"}}

course 的预期架构应如下所示:

{"course": {
      "type": "object",
            "properties": {
                "text": {
                    "type": "string",
                    "pattern":"[a-z]{2}[0-9]{2}"

                },
                "annotation": {
                    "type": "string"
                }
            }
        }}

但我没有重复 validType 的大块,而是期待类似于以下格式的内容:

{"course": {
                "$ref": "#/definitions/validType"
                "text":{"pattern":"[a-z][0-9]"}
}}

是啊!您可以添加约束,但不能修改您引用的约束。

要添加约束,您需要了解 draft-07 和之前版本的 $ref 是子模式存在时唯一允许的键。其他键如果存在则忽略。

因此,您需要创建两个子模式,其中一个具有您的参考,另一个具有您的附加约束。 然后将这两个子模式包装在 allOf.

这是它的样子...

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "course": {
      "allOf": [
        {
          "$ref": "#/definitions/validType"
        },
        {
          "properties": {
            "text": {
              "pattern": "[a-z][0-9]"
            }
          }
        }
      ]
    }
  }
}

玩一玩 https://jsonschema.dev