Подтвердить что ты не робот

Как определить схему 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"
                }
            }
        }
    ]
}

Можете ли вы мне помочь, как добиться правильной проверки для моего варианта использования?

4b9b3361

Ответ 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: numbermaxProperties: number если необходимо). Это сократило бы определение схемы:

{
     type: "object",
     minProperties: 1,
     properties: [/* your actual properties definitions */],
}

Ссылка на документацию: https://json-schema.org/understanding-json-schema/reference/object.html#size