JSON 模式对嵌套所需属性的适当行为?
Appropriate behavior of JSON schema for nested required properties?
假设我有一个这样的 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 具有 required 属性传播到顶部的事实,以便 myKey 被迫成为必需的?
换句话说,这两个对象中的哪一个(如果有的话)应该由这个模式验证?
{
"name": "myName",
}
{
"name": "myOtherName",
"myKey":
{
"A": [1, 2] // Note that B is missing
}
}
第一个根据架构有效,第二个无效。
读取properties标签的方法是:如果找到这个属性键,那么它必须满足这个模式。
{
"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": ""
}
}
假设我有一个这样的 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 具有 required 属性传播到顶部的事实,以便 myKey 被迫成为必需的? 换句话说,这两个对象中的哪一个(如果有的话)应该由这个模式验证?
{
"name": "myName",
}
{
"name": "myOtherName",
"myKey":
{
"A": [1, 2] // Note that B is missing
}
}
第一个根据架构有效,第二个无效。
读取properties标签的方法是:如果找到这个属性键,那么它必须满足这个模式。
{
"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": ""
}
}