json 模式中关键字之间的逻辑关系是什么?
What is the logical relationship between keyword in a json schema?
根据规范(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
}
}
}
最实用的解释方法是在 anyOf 和 not 关键字之间建立 "AND" 关系。
我在 v4 草案中找不到任何关于关键字如何逻辑交互的说明。任何人都可以指出 documentation/standard 来回答这个问题吗?
关键字始终是 "AND" 关系。数据必须满足架构中的 all 个关键字。
properties
和 items
关键字不指定对象的类型(为此您必须使用 type
)。相反,它们只对特定类型有意义,否则将被忽略。所以 properties
实际上意味着:
If the data is an object, then the following property definitions apply...
这意味着 {"properties":{...}}
将匹配任何字符串,因为 properties
对于不是对象的值将被忽略。而 items
实际上意味着:
If the data is an array, then the following item definitions apply...
所以 AND 组合看起来像:
(If the data is an object, then properties
applies) AND (if the data is an array, then items
applies)
正如规范明确规定的那样,某些关键字仅与一种特定类型的 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 架构的基本 属性。这几乎是一个要求,因为 JSON 对象中成员的顺序是无关紧要的({ "a": 1, "b": 2 }
与 { "b": 2, "a": 1 }
是相同的 JSON 对象)。
当然,如果只有一个关键字导致验证失败,则整个 JSON 值对架构无效。
根据规范(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
}
}
}
最实用的解释方法是在 anyOf 和 not 关键字之间建立 "AND" 关系。
我在 v4 草案中找不到任何关于关键字如何逻辑交互的说明。任何人都可以指出 documentation/standard 来回答这个问题吗?
关键字始终是 "AND" 关系。数据必须满足架构中的 all 个关键字。
properties
和 items
关键字不指定对象的类型(为此您必须使用 type
)。相反,它们只对特定类型有意义,否则将被忽略。所以 properties
实际上意味着:
If the data is an object, then the following property definitions apply...
这意味着 {"properties":{...}}
将匹配任何字符串,因为 properties
对于不是对象的值将被忽略。而 items
实际上意味着:
If the data is an array, then the following item definitions apply...
所以 AND 组合看起来像:
(If the data is an object, then
properties
applies) AND (if the data is an array, thenitems
applies)
正如规范明确规定的那样,某些关键字仅与一种特定类型的 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 架构的基本 属性。这几乎是一个要求,因为 JSON 对象中成员的顺序是无关紧要的({ "a": 1, "b": 2 }
与 { "b": 2, "a": 1 }
是相同的 JSON 对象)。
当然,如果只有一个关键字导致验证失败,则整个 JSON 值对架构无效。