Проверка схемы AJV для вложенного объекта

Функции возвращают объект, который выглядит примерно так:

    {
        "answer": {
           "vehicle_type": 1,
           "message": "Car"
        },
        "model": "VW",
        "color": "red"
    }

Объект «Ответ» всегда рядом. Остальные поля основаны на «типе транспортного средства».

E.g.

если vehicle_type = 1, есть «модель» и «цвет».

если vehicle_type = 2, есть «engine_count», «seat_count» и «wing_count».

Я пытаюсь написать JSON-схему, которую я буду использовать для проверки возвращаемого объекта.

Я хотел бы установить «модель» и «цвет» в качестве обязательных свойств, если «vehicle_type» равен 1. А если «vehicle_type» равен 2, то требуются «engine_count», «seat_count» и «wing_count».

Я использую валидатор схемы AJV (https://github.com/epoberezkin/ajv).

Для меня это проблематично, потому что vehicle_type вложен в ответ, а свойства, которые я хочу отметить как требуемые, находятся в родительском объекте. Другими словами, «validation_type» не находится на том же уровне, что «model» или «engine_count».

Я уже несколько раз подходил ... Я также пробовал с ключевыми словами ajv (переключатель, if / else / then), но мне не повезло

Любые идеи?


person Klik Kliković    schedule 06.06.2017    source источник


Ответы (1)


Для этого вы можете использовать свойство oneOf.

Если у вас будет «один из» транспортного средства типа 1 или типа 2. Тип 1 имеет определенные обязательные свойства, а тип 2 имеет другие требуемые свойства.

Например:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "id": "http://some.site.somewhere/entry-schema#",
  "oneOf": [
    {"$ref": "#/definitions/type1"},
    {"$ref": "#/definitions/type2"}
  ],
  "definitions": {
    "type1": {
      "type": "object",
      "properties": {
        "answer": {
          "type": "object",
          "properties": {
            "vehicle_type": {
              "type": "integer",
              "enum": [1]
            },
            "message": {
              "type": "string"
            }
          }
        },
        "model": {
          "type": "string"
        },
        "color": {
          "type": "string"
        }
      },
      "required": [
        "model",
        "color"
      ]
    },
    "type2": {
      "type": "object",
      "properties": {
        "answer": {
          "type": "object",
          "properties": {
            "vehicle_type": {
              "type": "integer",
              "enum": [2]
            },
            "message": {
              "type": "string"
            }
          }
        },
        "engine_count": {
          "type": "integer"
        },
        "seat_count": {
          "type": "integer"
        },
        "wing_count": {
          "type": "integer"
        }
      },
      "required": [
        "engine_count",
        "seat_count",
        "wing_count"
      ]
    }
  }
}
person Pedro    schedule 07.06.2017