JSON Schema枚举的所有可能组合

时间:2017-05-31 12:58:38

标签: json jsonschema

我目前正在为一些数据起草JSON模式。假设我的架构是这种形式:

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "title": "Title",
    "type": "array",
    "items": {
        "type":"object",
        "properties":{
                "property1": {
                    "type": "string",
                    "enum": ["ALPHA", "BETA"]
                 },
                "property2": {
                    "type": "string",
                    "enum": ["alpha", "beta"]
                },
                "val": {
                    "type": "number",
                    "min": 0,
                    "max": 100
                }
            },
        "required": ["property1", "property2", "val"]
    }
}

我的问题是,是否可以指定我们想要property1property2值的所有可能组合(以任何顺序没有重复)? val的值几乎肯定不会是唯一的。

我能想到的就是将"minItems": 4, "maxItems": 4,添加到"items"对象上方的架构中,但这只意味着我们最终会得到4个项目,并不保证它们是唯一的。

我不是要求任何人为我编写整个架构,只是寻找文档的指针,或简单的例子来推动我朝着正确的方向前进。

测试用例(包含以澄清我的观点

由于缺少其中一种组合,这应该会失败

{"data":[
     {
     "property1": "ALPHA",
     "property2": "alpha",
     "val": 7
     },{
     "property1": "ALPHA",
     "property2": "beta"
     "val": 16
     },{
     "property1": "BETA",
     "property2": "alpha"
     "val": 12
     }
]}

这应该会失败,因为其中一个组合会重复

{"data":[
     {
     "property1": "ALPHA",
     "property2": "alpha"
     "val": 73
     },{
     "property1": "ALPHA",
     "property2": "beta"
     "val": 72
     },{
     "property1": "BETA",
     "property2": "alpha"
     "val": 73
     },{
     "property1": "BETA",
     "property2": "beta"
     "val": 71
     },{
     "property1": "ALPHA",
     "property2": "beta"
     "val": 68
     }
]}

这应该通过

{"data":[
     {
     "property1": "ALPHA",
     "property2": "alpha"
     "val": 26
     },{
     "property1": "ALPHA",
     "property2": "beta"
     "val": 26
     },{
     "property1": "BETA",
     "property2": "alpha"
     "val": 32
     },{
     "property1": "BETA",
     "property2": "beta"
     "val": 83
     }
]}

这也应该通过

{"data":[
     {
     "property1": "ALPHA",
     "property2": "beta"
     "val": 15
     },{
     "property1": "BETA",
     "property2": "alpha"
     "val": 6
     },{
     "property1": "ALPHA",
     "property2": "alpha"
     "val": 65
     },{
     "property1": "BETA",
     "property2": "beta"
     "val": 37
     }
]}

2 个答案:

答案 0 :(得分:0)

枚举值可以是对象,您可以在对象级别使用它。

答案 1 :(得分:0)

我很确定它可以完成,但解决方案将是如此复杂和难以理解,以至于它不值得做。在您的情况下,我无法确切知道,但通常情况表明您在设计数据结构方面的选择很差。我会研究一下如何重组数据。