Одно свойство определяет типы в другом свойстве массива, используя схему JSON? - PullRequest
0 голосов
/ 15 февраля 2019

В этом примере JSON:

{
  "type": "number",
  "values": [ 34, 42, 99 ]
}

Можно ли определить схему JSON, которая гарантирует, что содержимое массива values соответствует типу, указанному в другом свойстве (в этом примере type)?

Выше type говорит, что массив values может содержать только целые числа (используя спецификатор "число").

Или указать, что values содержит строки:

{
  "type": "string",
  "values": [ "hello", "world" ]
}

Ответы [ 2 ]

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

Да, но вам придется написать блок if/then для каждого типа, который вы хотите поддерживать.

В схеме понимания JSON есть раздел на if/then/else: http://json -schema.org / creation-json-schema / reference / conditionals.html

Вот выдержка, объясняющая, как работает if/then/else.

Например, допустим, выхотел написать схему для обработки адресов в США и Канаде.В этих странах существуют разные форматы почтовых индексов, и мы хотим выбрать формат для проверки в зависимости от страны.Если адрес находится в Соединенных Штатах, поле postal_code представляет собой «почтовый индекс»: пять цифр, за которыми следует необязательный четырехзначный суффикс.Если адрес находится в Канаде, поле postal_code представляет собой шестизначную буквенно-цифровую строку, в которой чередуются буквы и цифры.

{
  "type": "object",
  "properties": {
    "street_address": {
      "type": "string"
    },
    "country": {
      "enum": ["United States of America", "Canada"]
    }
  },
  "if": {
    "properties": { "country": { "const": "United States of America" } }
  },
  "then": {
    "properties": { "postal_code": { "pattern": "[0-9]{5}(-[0-9]{4})?" } }
  },
  "else": {
    "properties": { "postal_code": { "pattern": "[A-Z][0-9][A-Z] [0-9][A-Z][0-9]" } }
  }
}

Для каждого типа, который вы хотите поддерживать, вам нужно будет написать if/thenобъект, и оберните их все в allOf.

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

Да, вы можете использовать ключевое слово "items".Если оно имеет одно значение, то это значение является схемой для каждого элемента массива.

{
    "type": "array",
    "items": { "type: "string" }
}

Если вы используете схему draft4, как это делают большинство людей, в разделе 8.2.3.1 из Спецификация гласит:

8.2.3.1.Если "items" является схемой

Если items является схемой, то дочерний экземпляр должен быть допустимым для этой схемы, независимо от его индекса и независимо от значения "AdditionalItems".

...