如何定义至少需要许多属性之一的JSON模式

ep6jt1vc  于 2023-01-10  发布在  其他
关注(0)|答案(2)|浏览(109)

我想知道我是否可以定义一个JSON模式(草案4),它至少需要一个对象的许多可能属性中的一个。我已经知道allOfanyOfoneOf,但只是不知道如何以我想要的方式使用它们。
下面是一些JSON示例:

// Test Data 1 - Should pass
{

    "email": "hello@example.com",
    "name": "John Doe"
}
// Test Data 2 - Should pass
{
    "id": 1,
    "name": "Jane Doe"
}
// Test Data 3 - Should pass
{
    "id": 1,
    "email": "hello@example.com",
    "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"
}

我希望至少需要idemail(也接受两者),并且根据格式仍然通过验证。如果我提供两者(测试3),则使用oneOf会导致验证失败,即使其中一个无效,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"
                }
            }
        }
    ]
}

您能帮助我如何为我的用例实现正确的验证吗?

vmdwslir

vmdwslir1#

要至少需要一组属性中的一个,请在一系列anyOf选项中使用required

{
    "type": "object",
    "anyOf": [
        {"required": ["id"]},
        {"required": ["email"]}
        // any other properties, in a similar way
    ],
    "properties": {
        // Your actual property definitions here
    }
}

如果您需要的任何属性存在("id""email"),则它将传递allOf中的相应选项。

iyfjxgzm

iyfjxgzm2#

您可以使用minProperties: number(如果需要,还可以使用maxProperties: number),这样可以缩短模式定义:

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

Link to documentation: https://json-schema.org/understanding-json-schema/reference/object.html#size

相关问题