Как определить схему JSON, которая требует хотя бы одного из многих свойств
Я хотел бы знать, могу ли я определить схему JSON (проект 4), для которой требуется хотя бы одно из многих свойств объекта. Я уже знаю allOf
, anyOf
и oneOf
, но просто не могу понять, как их использовать так, как я хочу.
Вот пример JSON для иллюстрации:
// Test Data 1 - Should pass
{
"email": "[email protected]",
"name": "John Doe"
}
// Test Data 2 - Should pass
{
"id": 1,
"name": "Jane Doe"
}
// Test Data 3 - Should pass
{
"id": 1,
"email": "[email protected]",
"name": "John Smith"
}
// Test Data 4 - Should fail, invalid email
{
"id": 1,
"email": "thisIsNotAnEmail",
"name": "John Smith"
}
// Test Data 5 - Should fail, missing one of required properties
{
"name": "John Doe"
}
Я хотел бы потребовать, по крайней мере, id
или email
(также принять их оба) и все равно пройти проверку в соответствии с форматом. Использование oneOf
завершает проверку, если я предоставляю оба (тест 3), anyOf
проходит проверку, даже если один из них недействителен (тест 4)
Вот моя схема:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"id": "https://example.com",
"properties": {
"name": {
"type": "string"
}
},
"anyOf": [
{
"properties": {
"email": {
"type": "string",
"format": "email"
}
}
},
{
"properties": {
"id": {
"type": "integer"
}
}
}
]
}
Можете ли вы мне помочь, как добиться правильной проверки для моего варианта использования?
Ответы
Ответ 1
Чтобы потребовать хотя бы один из набора свойств, используйте required
внутри серии опций anyOf
:
{
"type": "object",
"anyOf": [
{"required": ["id"]},
{"required": ["email"]}
// any other properties, in a similar way
],
"properties": {
// Your actual property definitions here
}
{
Если присутствует какое-либо из свойств, которые вы хотите ("id"
, "email"
), он передает соответствующую опцию в allOf
.
Ответ 2
Вы можете использовать minProperties: number
(и maxProperties: number
если необходимо). Это сократило бы определение схемы:
{
type: "object",
minProperties: 1,
properties: [/* your actual properties definitions */],
}
Ссылка на документацию: https://json-schema.org/understanding-json-schema/reference/object.html#size