Проверка схемы 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"
]
}
}
}