Как расширить мета-схему JSON-схемы для поддержки новых свойств? - PullRequest
0 голосов
/ 16 февраля 2019

Я хочу разрешить свойства $ role в любом месте документа схемы json, где разрешен тип.Теоретически я должен иметь возможность расширять его, как показано ниже, где я делаю allOf как с мета-схемой схемы json, так и с моим расширением для $ role, которое включает дополнительные свойства для рекурсивного выбора моей мета-схемы расширения.Я обнаружил, что я получаю подтверждение для роли $ верхнего уровня, но не для любой встроенной.Я что-то пропустил?Есть ли какой-то другой способ расширения мета-схемы JSON-схемы?

Я пробовал несколько разных валидаторов, и все они не смогли проверить вторую роль $ в примере.

{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "definitions": {
        "role": {
            "type": "string",
            "pattern": "^((lg)|(unionType\\([a-zA-Z][a-zA-Z0-9.]*\\)))$"
        },
    },
    "allOf": [
        {
            "$ref": "http://json-schema.org/draft-07/schema#"
        },
        {
            "properties": {
                "additionalProperties": {
                    "$ref": "#"
                },
                "$role": {
                    "oneOf": [
                        {
                            "$ref": "#/definitions/role"
                        },
                        {
                            "type": "array",
                            "items": {
                                "$ref": "#/definitions/role"
                            }
                        }
                    ]
                }
            }
        }
    ]
}

Пример использования этой схемы:

{
    "$schema": "schema.json",
    "title": "Prompt",
    "$role": "unionType(Microsoft.IPrompt)",
    "properties": {
        "prompt": {
            "type": "string",
            "$role":"foo"
        }
    }
}

Я ожидаю, что вторая роль должна быть недопустимой в соответствии со схемой.Что я получаю, так это то, что он действителен, даже если он не соответствует шаблону $ role.Первая $ роль успешно прошла проверку.

1 Ответ

0 голосов
/ 17 февраля 2019

Да, расширение мета-схемы сложнее, чем кажется.Изучите метасхему JSON Hyper-Schema , чтобы узнать, как расширить мета-схему.JSON Hyper-Schema добавляет два ключевых слова: base и `links.При расширении схемы необходимо переопределить любую рекурсивную ссылку, используемую в исходной схеме.

Схемы JSON (включая мета-схемы) являются неизменяемыми.Вы не можете выборочно изменить существующую схему.Ваша мета-схема проверяет только ключевое слово $role, все остальные ключевые слова проверяются мета-схемой draft-07.Поскольку ваша мета-схема не изменяет схему черновика-07, ключевые слова, такие как properties, полностью проверяются в контексте схемы черновика-07 и без знания нового ключевого слова, добавленного в другую схему.

К сожалению, в расширении схем задействовано столько дублирования, и над этой проблемой ведется работа.Потенциальное решение для облегчения этого намечено представить в следующем проекте.

...