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

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

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

Объект "Ответ" всегда есть. Другие поля там основаны на типе vehicle_type.

Например

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

если тип_транспорта = 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 вложен в 'answer', а свойства, которые я хочу пометить как обязательные, находятся на родительском объекте. Другими словами, 'validation_type' не находится на том же уровне, что и 'model' или 'engine_count'.

Я уже несколько раз подошел... Я также попытался с ajv-ключевые слова (переключатель, если / иначе / тогда), но мне не повезло

Есть идеи?

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"
      ]
    }
  }
}
Другие вопросы по тегам