json模式中关键字之间的逻辑关系是什么?

时间:2015-01-08 18:28:05

标签: json jsonschema json-schema-validator

根据规范(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中找不到关键词如何在逻辑上互动的任何迹象。有人能指出我会回答这个问题的文件/标准吗?

2 个答案:

答案 0 :(得分:0)

关键字始终是“与”关系。数据必须满足模式中的所有关键字。

propertiesitems关键字未指定对象的类型(您必须使用type)。相反,它们只对特定类型有意义,否则会被忽略。所以properties实际上意味着:

  

如果数据是对象,则以下属性定义适用...

这意味着{"properties":{...}}将匹配任何字符串,因为对于非对象的值,将忽略properties。而items实际上意味着:

  

如果数据是数组,则以下项目定义适用...

所以AND组合看起来像:

  

(如果数据是对象,那么properties适用)AND(如果数据是数组,那么items适用)

答案 1 :(得分:0)

正如规范明确规定的那样,某些关键字仅与一种特定类型的JSON值或所有这些关键字相关。

因此,例如,properties仅在您验证的JSON值是JSON对象时才适用。在任何不是对象的JSON值上,它将不适用(另一种理解方式是,如果要验证的JSON值不是JSON对象,则对此关键字的验证将始终成功)。

同样,items仅在JSON值为JSON数组时才适用。

现在,其他一些关键字适用于所有类型;其中包括enumallOfanyOfoneOftype。在每种情况下,验证规则都在规范中明确定义。

简而言之:您应该考虑预期的价值类型。在模式中强制值为给定类型的最简单方法是使用type,如:

"type": "integer"

但是,此关键字将在验证过程中独立应用于所有其他关键字。所以,这是一个法律架构:

{
    "type": "integer",
    "minItems": 1
}

如果传递空JSON数组进行验证,则两个关键字都将失败:

  • type因为该值不是数组;
  • minItems因为该值是一个数组,但它没有元素,这对于这个特定关键字是非法的,因为它至少需要数组中的一个元素。

请注意,验证结果完全独立于评估关键字的顺序。这是JSON Schema的基本属性。由于JSON对象中的成员顺序无关紧要({ "a": 1, "b": 2 }{ "b": 2, "a": 1 }是相同的JSON对象),因此它几乎是必须的。

当然,如果只有一个关键字导致验证失败,则整个JSON值对架构无效。