Ответ 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
не будет правильно исправляться.