json schema根据一个或另一个模式验证所有数组项

时间:2014-08-03 19:56:58

标签: arrays json jsonschema

给出以下架构:

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "definitions": {
        "worktype": {
            "blue": {
                "enum": [1, 2, 3]
            },
            "red": {
                "enum": [4, 5, 6]
            }
        }
    }
}

我可以验证一个数组是否包含所有" blue"项目或"红色"像这样的项目:

{
                "type": "array",
                "items": {
                    "$ref": "#/definitions/worktype/red"    // or worktype/blue
                }
}

但是如何验证数组只有" blue"或"红色"工作类型,但不是混合的?

例如:

[1, 2]: Valid (only blue)
[5]: Valid (only red)
[1, 6]: Invalid (mixed blue and red)

我的第一个想法是使用oneOf

{
                "type": "array",
                "items": {
                    "oneOf": [
                        {"$ref": "#/definitions/worktype/red"},
                        {"$ref": "#/definitions/worktype/blue"},
                    ]
                }
}

但是这会针对模式检查每个条目,因此例如[1, 6]也是有效的。 (在这种情况下,oneOf并不意味着&#34; 所有项目必须对一个一起有效&#34;但是&#34; < strong>每个项必须对一个自身&#34;)有效。

如何为只有&#34; blue&#34;的数组编写模式?或&#34;红色&#34;工作类型,但不是两者兼而有之?这可能吗?

1 个答案:

答案 0 :(得分:0)

我明白了,我的第一个想法是正确的,但是oneOf只是嵌套了一层太深。这就像我想要的那样:

{
                "type": "array",
                "oneOf": [
                    {
                        "items": {
                            "$ref": "#/definitions/worktype/red"
                        }   
                    },  
                    {
                        "items": {
                            "$ref": "#/definitions/worktype/blue"
                        }   
                    }   
                ]
}