Подтвердить что ты не робот

Схема JSON относительно использования $ref

Я понимаю, что $ref берет URI для использования json-схемы, но где $ref: "#" указывает на? Это просто означает использование текущей схемы для этого уровня блока? Или это означает использовать схему корневого уровня, определенную в идентификаторе корневого уровня? Спасибо

EDIT: Поэтому, если у меня есть:

"items": {
        "anyOf": [
            { "$ref": "#" },
            { "$ref": "#/definitions/schemaArray" }
        ],
        "default": {}
    }

Поскольку в нем отсутствует поле идентификатора, он сначала попытается проверить элементы экземпляра с корневой схемой, а затем, если это не удается, попробуйте проверить его с помощью схемы schemaArray, определенной в схеме определений, правильно?

Итак, если я изменю его на:

 "items": {
            "id" : "#/items",
            "anyOf": [
                { "$ref": "#" },
                { "$ref": "#/definitions/schemaArray" }
            ],
            "default": {}
        }

Тогда первая подсхема в массиве anyOf укажет на сама схема элементов?

EDIT # 2: Хорошо, если бы у меня было:

 "items": {
        "id" : "itemSchema",
        "anyOf": [
            { "$ref": "#" },
            { "$ref": "#/definitions/schemaArray" }
        ],
        "default": {}
    }

и

"stringArray": {
        "type": "array",
        "items": { "$ref" : "itemSchema" },
        "minItems": 1,
        "uniqueItems": true
    }

Поле "itemsArray" "items" будет проверено против вышеуказанных "itemsSchema"?

Также работает ли второй $ref в 'anyOf', перейдя к корню, а затем пересекая путь до тех пор, пока он не ударит по этой схеме? Благодарю!

4b9b3361

Ответ 1

ОК: каждый $ref разрешен в полный URI. После того, как это будет сделано, на все ваши вопросы ответят, задав вопрос: Какую схему я бы привел, если бы я просто выбрал этот URI? Где $ref, как он был загружен, все от этого не имеет значения - он полностью зависит от разрешенного URI.

В библиотеке могут быть несколько ярлыков (например, кэшировать документы, так что они выбираются только один раз или доверяют одной схеме "говорить за" ), но это все детали реализации.

Ответ на исходный вопрос:

# не является особенным: все значения $ref разрешаются как URI относительно текущего документа (или ближайшего значения "id", если он есть).

Поэтому, если вы не использовали "id", то # будет указывать на корень документа схемы. Если вы выберете свою схему из http://example.com/schema, то {"$ref": "#"} в любом месте внутри будет разрешено http://example.com/schema#, что является самим документом.

Другое, если вы используете "id", потому что он изменяет "базовую" схему, по которой разрешен $ref:

{
    "type": "array",
    "items": {
        "id": "http://example.com/item-schema",
        "type": "object",
        "additionalProperties": {"$ref": "#"}
    }
}

В этом примере $ref разрешается http://example.com/item-schema#. Теперь, если ваша настройка JSON Schema доверяет схеме, которую она уже имеет, то она может повторно использовать значение из "элементов".

Однако, нет ничего особенного в # - он просто решает URI, как и любой другой.

Ответ на EDIT 1:

Ваш первый пример правильный.

Однако, к сожалению, второй, к сожалению, нет. Это связано с тем, как разрешение фрагментов работает для URI: один фрагмент полностью заменяет другой. Когда вы разрешите # по значению "id" #/items, вы снова не получите #/items - вы получите #. Итак, во втором примере первая запись в "anyOf" будет по-прежнему разрешаться в корневом документе, как и в первом примере.

Ответ на EDIT 2:

Предполагая, что документ загружен из http://example.com/my-schema, полные URI ваших двух $ref:

  • http://example.com/itemSchema#
  • http://example.com/itemSchema#/definitions/schemaArray

Для первой библиотеки может использовать уже имевшуюся в ней схему, но это может быть не так - в конце концов, глядя на URI, http://example.com/my-schema может не доверять точно представлять http://example.com/itemSchema.

Для второго - это не будет работать, потому что "itemSchema" не имеет секции "definitions", так что $ref не будет правильно исправляться.