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

Posted

技术标签:

【中文标题】如何定义至少需要许多属性之一的 JSON 模式【英文标题】:How to define a JSON schema that requires at least one of many properties 【发布时间】:2015-10-28 15:30:56 【问题描述】:

我想知道我是否可以定义一个 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"
                
            
        
    ]

您能帮我如何正确验证我的用例吗?

【问题讨论】:

【参考方案1】:

要至少要求一组属性中的一个,请在一系列 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 中的相应选项。

【讨论】:

【参考方案2】:

您可以使用minProperties: number(如果需要,还可以使用maxProperties: number)。 这将缩短架构定义:


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

文档链接:https://json-schema.org/understanding-json-schema/reference/object.html#size

【讨论】:

这实际上是一个糟糕的解决方案,因为不包含架构中定义的任何属性但具有架构中不存在的属性的对象仍将验证。示例: "foo": "bar" 将针对 "type": "object", "minProperties": 1, "properties": "test": "type": "string" , "bar": "type": "string" 进行验证。 @Benni 那么"additionalProperties": false 呢? 那行得通。阅读更多here。

以上是关于如何定义至少需要许多属性之一的 JSON 模式的主要内容,如果未能解决你的问题,请参考以下文章

如何在 json 模式中表示 sum/union 类型

VSCode仅为许多项目之一创建Launch.json和Tasks.json文件

使用 Apache Beam 和数据流将许多 json 加载到 BQ - json 模式错误

如何将 JSON 数据格式化为动态生成对象属性的 C# 对象

如何在 JSON 模式中扩展模式?

我如何需要一个或另一个领域或(另外两个)中的一个但不是全部?