我正在构建一个嵌套的JSON模式,我正在尝试尽可能多地创建可重用的组件。所以我有以下内容:
{
"$schema": "http://json-schema.org/schema#",
"title": "low_level_obj",
"type": "object",
"additionalProperties": true,
"properties": {
"prop1":{"type": "string"},
"prop2":{"type": "string"},
"prop3":{"type": "string"}
},
"required": ["prop1"]
}
此架构存储为low_level_obj_schema.json,并由许多其他架构引用,如下所示:
{
"$schema": "http://json-schema.org/schema#",
"title": "higher_level",
"type": "object",
"additionalProperties": false,
"properties": {
"our_obj": {
"$ref":"file:low_level_obj_schema.json"
},
"some_string": {"type": "string"}
},
"required": [
"our_obj",
"some_string"
]
}
我希望能够从higher_level模式更改low_level_obj的要求 - 即对于low_level_object的这个特定实例,我想确保Prop2也存在。
我在higher_level架构中尝试了以下内容:
"our_obj": {
"$ref":"file:low_level_obj_schema.json"
"required": ["prop2"]
},
当我通过pythons jsonschema.validate运行时,我没有收到错误,但验证通过“prop2”是否在我的对象实例中。所以我认为要求被覆盖或忽略。我试过从low_level_object中删除“required”约束,但这没有帮助。
我似乎无法在文档中找到任何内容,但我怀疑我有点像莳萝。有没有办法做到这一点 - 当然我不需要一个全新的架构?
答案 0 :(得分:1)
答案似乎是使用oneOf,allOf,anyOf关键字之一。我在更高级别的架构中使用了以下代码段:
"our_obj": {
"oneOf": [{"$ref":"file:low_level_obj_schema.json"}],
"required": ["prop2"]
},
现在,验证以下数据:
test_data_1 = {our_obj: {"prop1": "text", "prop2": "text"}, "some_string": "text"}
test_data_2 = {our_obj: {"prop1": "text", "prop3": "text"}, "some_string": "text"}
test_data_3 = {our_obj: {"prop1": "text"}, "some_string": "text"}
test_data_4 = {our_obj: {"prop2": "text"}, "some_string": "text"}
给出以下答案:
test_data 1: Valid
test_data 2: Data Validation Failed: u'prop2' is a required property
test_data 3: Data Validation Failed: u'prop2' is a required property
test_data 4: Data Validation Failed: {"prop2": "text"} is not valid under any of the given schemas
这是我想要的行为,但我不禁觉得应该有另一种方式。