在anyOf中嵌套oneOf以获取JSON模式

时间:2019-09-30 17:56:02

标签: jsonschema ajv

以下是用于链接说明的JSON模式和JSON,如下所示。

JSON Schema and the JSON

格式: 数组内的个人JSON对象(具有其附加属性,并且可能与数组中的其他对象有所不同)可以是任意3个区域:“ america”,“ asia”和“ europe”,并且至少应使用区域对象的类型在那里。这可以通过数组minItems属性来实现)

问题陈述:

  1. 数组中的单个JSON对象可以是任意3个区域:“ america”,“ asia”和“ europe”,并且至少应存在区域对象类型

    ==>我可以通过将所有区域对象放在anyOf数组中来解决此问题,因为我要匹配至少一个有效区域对象。

  2. JSON对象“ asia”或“ europe”可以与其他区域类型一起存在。两者不能共存。

    ==>我试图使用'oneOf',但是它通过了ajv验证。实际上,它应该失败。谁能帮忙。谢谢

JSON模式

{
    "type": "object",
    "properties": {
        "stat_data": {
            "type": "array",
            "minItems": 1,
            "items": {
                "type": "object",
                "properties": {},
                "anyOf": [{
                        "required": ["region"],
                        "properties": {
                            "region": {
                                "enum": ["america"]
                            },
                            "country": {
                                "type": "string"
                            },
                            "population": {
                                "type": "string"
                            }
                        }
                    },
                    {
                        "oneOf": [
                            {
                                "required": ["region"],
                                "properties": {
                                    "region": {
                                        "enum": ["asia"]
                                    },
                                    "country": {
                                        "type": "string"
                                    },
                                    "details": {
                                        "type": "object",
                                        "properties": {
                                            "language": {
                                                "type": "string"
                                            },
                                            "tz": {
                                                "type": "string"
                                            }
                                        }
                                    }
                                }
                            }, {
                                "required": ["region"],
                                "properties": {
                                    "region": {
                                        "enum": ["europe"]
                                    },
                                    "country": {
                                        "type": "string"
                                    },
                                    "language": {
                                        "type": "string"
                                    }
                                }
                            }
                        ]
                    }
                ]
            }
        }
    }
}

无法同时存在作为“亚洲”和“欧洲”类型对象的JSON对象。

{
    "stat_data": [{
            "region": "america",
            "country": "USA",
            "states": "50"
        }, {
            "region": "asia",
            "country": "Japan",
            "details": {
                "language": "Japanese",
                "tz": "utc+9.00"
            }
        }, {
            "region": "europe",
            "country": "finland",
            "language": "Finnish"
        }
    ]
}

作为“亚洲”类型对象的PASS JSON对象存在。

{
    "stat_data": [{
            "region": "america",
            "country": "USA",
            "states": "50"
        }, {
            "region": "asia",
            "country": "Japan",
            "details": {
                "language": "Japanese",
                "tz": "utc+9.00"
            }
        }
    ]
}

作为“欧洲”类型对象的PASS JSON对象存在。

{
    "stat_data": [{
            "region": "america",
            "country": "USA",
            "states": "50"
        }, {
            "region": "europe",
            "country": "finland",
            "language": "Finnish"
        }
    ]
}

1 个答案:

答案 0 :(得分:1)

我可以看到您尝试使用这种方法的原因,但是它无法按预期工作,因为您已定义,数组中的每个项目都可能是 string[] source = new string[] { "|title1|title2|title3|title4|title5|", "|Word1|Word2|Word3|Word4|Word5|", }; // { // {"title1", "title2", "title3", "title4", "title5"}, // { "Word1", "Word2", "Word3", "Word4", "Word5"} // } string[,] array = SplitArrays(source); 或(america或{{ 1}}),这不是您想要的。

请记住,europe将值模式应用于数组中的EACH元素。它对整个数组本身没有任何约束。 asia检查数组中的至少一项是否针对其值架构进行了验证。

您要说的是,数组中的每个项目都可能具有itemscontainsamerica,但是如果数组包含{ {1}},以及反之。

我已经重构了架构并进行了一些更改。

希望您还可以看到使用europe >>(asiaeurope> asia)的意图很明显。

JSON模式通过添加约束来工作。通常,您不能通过遗漏来定义约束。

JSON Schema and data validation demo

oneOf