根据规范(http://json-schema.org/schema),模式关键字之间不存在互斥。 例如,我可以创建以下模式:
{
"properties" : {
"foo" : {"type" : "string"}
}
"items" : [
{"type" : "integer" },
{"type" : "number" }
]
}
此架构是否会针对对象和数组进行验证? 如果是这样的话,就意味着" OR"关键词之间的关系。
但是如果我们考虑以下架构:
{
"anyOf" : [
{ "type" : "string",},
{ "type" : "integer"}
]
"not" : {
{ "type" : "string",
"maxLength" : 5
}
}
}
解释它的最实用的方法是" AND" anyOf和not关键字之间的关系。
我在草案v4中找不到关键词如何在逻辑上互动的任何迹象。有人能指出我会回答这个问题的文件/标准吗?
答案 0 :(得分:0)
关键字始终是“与”关系。数据必须满足模式中的所有关键字。
properties
和items
关键字未指定对象的类型(您必须使用type
)。相反,它们只对特定类型有意义,否则会被忽略。所以properties
实际上意味着:
如果数据是对象,则以下属性定义适用...
这意味着{"properties":{...}}
将匹配任何字符串,因为对于非对象的值,将忽略properties
。而items
实际上意味着:
如果数据是数组,则以下项目定义适用...
所以AND组合看起来像:
(如果数据是对象,那么
properties
适用)AND(如果数据是数组,那么items
适用)
答案 1 :(得分:0)
正如规范明确规定的那样,某些关键字仅与一种特定类型的JSON值或所有这些关键字相关。
因此,例如,properties
仅在您验证的JSON值是JSON对象时才适用。在任何不是对象的JSON值上,它将不适用(另一种理解方式是,如果要验证的JSON值不是JSON对象,则对此关键字的验证将始终成功)。
同样,items
仅在JSON值为JSON数组时才适用。
现在,其他一些关键字适用于所有类型;其中包括enum
,allOf
,anyOf
,oneOf
,type
。在每种情况下,验证规则都在规范中明确定义。
简而言之:您应该考虑预期的价值类型。在模式中强制值为给定类型的最简单方法是使用type
,如:
"type": "integer"
但是,此关键字将在验证过程中独立应用于所有其他关键字。所以,这是一个法律架构:
{
"type": "integer",
"minItems": 1
}
如果传递空JSON数组进行验证,则两个关键字都将失败:
type
因为该值不是数组; minItems
因为该值是一个数组,但它没有元素,这对于这个特定关键字是非法的,因为它至少需要数组中的一个元素。请注意,验证结果完全独立于评估关键字的顺序。这是JSON Schema的基本属性。由于JSON对象中的成员顺序无关紧要({ "a": 1, "b": 2 }
与{ "b": 2, "a": 1 }
是相同的JSON对象),因此它几乎是必须的。
当然,如果只有一个关键字导致验证失败,则整个JSON值对架构无效。