Ограничение значений перечисления, определенных в отдельной JSONschema

#json #validation #enums #schema

#json #проверка #перечисления #схема

Вопрос:

У меня есть простая схема только перечисления отдельно от схемы полезной нагрузки, например, так

 {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "title": "demo::common::Husbandry",
    "properties": {
        "Anilmals": {
            "$ref": "#/definitions/Anilmals"
        },
        "Breeds": {
            "$ref": "#/definitions/Breeds"
        }
    },
    "definitions": {
        "Anilmals": {
            "type": "string",
            "description": "Any animal",
            "minLength": 1,
            "maxLength": 30,
            "enum": [
                "Dog",
                "Cat",
                "Bear",
                "Human"
            ]
        },
        "Breeds": {
            "type": "string",
            "description": "Any Breed",
            "minLength": 1,
            "maxLength": 30,
            "enum": [
                "Poodle",
                "Cheshire",
                "Polar",
                "Trump"
            ]
        }
    }
}
  

Если бы я / производитель полезной нагрузки должен был отправить более строгую схему поверх этого, чтобы выразить и кодировать дополнительные правила, не нарушая исходную схему, примеркогда выбранное животное было «Кошка», они могут выбрать только «Чешир» в качестве породы и так далее, как бы я закодировал более строгую схему? Обратите внимание, что исходная схема не подлежит изменению и доступна только для чтения. Возможно, мне потребуется использовать anyOf или oneOf, но, похоже, я не могу найти хороший пример.

 {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "additionalProperties": false,
    "properties": {
        "ReferenceToLocalSchema": {
            "$ref": "#/definitions/LocalType"
        },
        "ReferenceToExternalSchema": {
            "$ref": "masterh-husbandry.json#/properties"
        }
    },
    "definitions": {
        "LocalType": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
                "no-write": {
                    "type": "boolean",
                    "default": false
                }
            }
        }
    }
}