在引用的JSON模式中添加“required”

时间:2015-11-13 16:20:36

标签: python json

我正在构建一个嵌套的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”约束,但这没有帮助。

我似乎无法在文档中找到任何内容,但我怀疑我有点像莳萝。有没有办法做到这一点 - 当然我不需要一个全新的架构?

1 个答案:

答案 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

这是我想要的行为,但我不禁觉得应该有另一种方式。