JSON模式对嵌套的必需属性的适当行为?

时间:2015-08-20 12:53:33

标签: json jsonschema

假设我有一个像这样的JSON模式:

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "type": "object",
    "properties": {
        "name": {"type": "string"},
        "myKey": {"$ref": "myKey.json#"}
    },
    "additionalProperties": false
}

然后在其他地方我有myKey.json:

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "type": "object"
    "properties": {
        "A": {
            "type": "array",
            "description": "Array of stream object IDs",
            "items": { "type": "integer" }
        },
        "B": {
            "type": "array",
            "description": "Array of stream object IDs",
            "items": {"type": "integer" }
        }
    },
    "required": ["A", "B"],
    "additionalProperties": false
}

重要的是,在myKey中,有两个必需的属性,但不需要myKey本身。是吗? 事实上,myKey要求属性传播到顶部,以便强制myKey成为必需? 换句话说,这两个对象中的哪一个(如果有的话)应该通过这种模式进行验证?

{
  "name": "myName",
}

{
  "name": "myOtherName",
  "myKey": 
   {
     "A": [1, 2]      // Note that B is missing
   }
}

1 个答案:

答案 0 :(得分:2)

第一个根据架构有效,第二个有效。

读取属性标记的方法是:如果找到此属性键,则它必须满足此模式。

{
  "name": "myName"
}

对于上述对象, myKey 不是必需的,因此它满足架构。

{
  "name": "myOtherName",
  "myKey": 
   {
     "A": [1, 2]      // Note that B is missing
   }
}

对于第二个对象,存在 myKey ,因此它必须满足该属性的架构。但它不满意,因为它应该同时具有 A B 属性。

同样的想法适用于每个级别。以下对象满足模式:

{
    "name": "myOtherName",
    "myKey": 
    {
        "A": [],
        "B": []
    }
}

但这不是:

{
    "name": "myOtherName",
    "myKey": 
    {
        "A": [],
        "B": ""
    }
}