Схема JSON - Перечисление или объект - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь написать схему для проверки следующего:

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

Например, если предположить, что значения перечисления равны A или B, допустимый объект может выглядеть следующим образом.

{
  "test": "A",
  "test1": "B",
  "test2": {
    "test4": "A",
    "test5": {
      "test6": "B"
    }
  }
}

1 Ответ

0 голосов
/ 30 мая 2018

РЕДАКТИРОВАТЬ:

Лучше и короче схема с самоопределением, вы можете попробовать онлайн

anyOf лучше, чем oneOf, поскольку oneOf необходимо проверить по всем элементам, чтобы убедиться, что есть только один проход, но anyOf может остановиться после первого прохода, пропуская другие элементы.

{
  "anyOf": [
    {
      "enum": ["A", "B"]
    },
    {
      "type": "object",
      "additionalProperties": {
        "$ref": "#"
      }
    }
  ]
}

anyOfна уровне корня, необходимого для обхода ограничения JSON Schema, согласно которому $ref игнорирует все родственные ключевые слова.

Проверено с помощью ajv cli

{
  "anyOf": [
    {"$ref": "#/definitions/Foo"}
  ],
  "definitions": {
    "Foo": {
      "oneOf": [
        {
          "enum": ["A", "B"]
        },
        {
          "type": "object",
          "additionalProperties": {
            "$ref": "#/definitions/Foo"
          }
        }
      ]
    }
  }
}
...