Ограничение значений с помощью «enum» для свойства, набранного с «$ ref» - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть базовая схема base.json, которая определяет тип с именем foobar:

{
  "definitions": {
    "foobar": {
      "type": "string"
    }
  }
}

Затем у меня есть другая схема instance.json, которая основывается на этом типе и пытается ограничить ее потенциальные значения:

{
  "type": "object",
  "properties": {
    "raboof": {
      "$ref": "base.json#/definitions/foobar",
      "enum": [
        "this is a foobar!"
      ]
    }
  }
}

Если я пытаюсь проверить следующий файл wrong_data.json:

{
  "raboof": "not really a foobar..."
}

мой инструмент проверки не сообщает об ошибке.

Я получаю ошибку, если яизмените "$ref": "base.json#/definitions/foobar" на "type": "string" в instance.json.

Неправильно ли я это понимаю?

1 Ответ

1 голос
/ 05 апреля 2019

Базовая спецификация схемы JSON для draft-7 (последняя версия) гласит следующее в разделе о $ref ...

Схема объекта со свойством $ ref ДОЛЖНА интерпретироваться как
Ссылка "$ ref". Значение свойства $ ref ДОЛЖНО быть URI
Ссылка. Разрешенный к текущей базе URI, он идентифицирует
URI схемы для использования. Все остальные свойства в объекте "$ ref" ДОЛЖНЫ быть проигнорированным.

https://tools.ietf.org/html/draft-handrews-json-schema-01#section-8.3

Обратите внимание, что вы не можете использовать $ref с другими ключевыми словами в том же объекте, так как другие ключи в этом объекте будут игнорироваться.

Вы можете обойти это ограничение, обернув allOf ...

{
  "allOf": [
    { "$ref": "base.json#/definitions/foobar" },
    { "enum": [ "this is a foobar!" ] }
  ]
}

Это будет разрешено в draft-8, поэтому обходной путь больше не потребуется, но он еще не выпущен.

...