Применение дополнительных ограничений к ссылочному определению в схеме JSON - PullRequest
1 голос
/ 13 марта 2020

Я определил в схеме validType, где каждый атрибут должен иметь text и annotation.

Я хочу добавить дополнительные ограничения для уточнения text из course, которые должны следовать "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]"}
}}

1 Ответ

0 голосов
/ 13 марта 2020

Да! Вы можете добавить ограничения, но вы не можете изменить ссылки, на которые вы ссылаетесь.

Чтобы добавить ограничения, вы должны понимать, что $ref для черновика-07 и предыдущего является единственным разрешенным ключом в подсхеме при выходе. Другие ключи игнорируются, если он существует.

Таким образом, вам необходимо создать две подсхемы, одна из которых имеет вашу ссылку, а другая - дополнительное ограничение. Затем вы оборачиваете эти две подсхемы в 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...