json模式中的属性和patternProperties有什么区别?

时间:2015-06-19 10:32:12

标签: jsonschema

对于以下json字符串:

{
    "abc" : 123,
    "def" : 345
}

以下架构认为它有效:

{
    "$schema": "http://json-schema.org/draft-03/schema#",
    "title": "My Schema",
    "description": "Blah",
    "type": "object",
    "patternProperties": {
        ".+": {
            "type": "number"
        }
    }
}

但是,将patternProperties更改为属性仍认为它有效。那么,这两个标签之间的区别是什么?

4 个答案:

答案 0 :(得分:6)

对于上面的架构,所有属性都应该是数字。此数据无效:

{ a: 'a' }

如果将patternProperties替换为仅属性'。+'应该是数字。所有其他属性可以是任何东西。这将是无效的:

{ '.+': 'a' }

这是有效的:

{ a: 'a' }

答案 1 :(得分:2)

使用properties关键字定义对象上的属性(键值对)。属性的值是一个对象,其中每个键是属性的名称,每个值都是用于验证该属性的JSON模式。

additionalProperties可以限制对象,使其没有未明确列出的其他属性,或者可以为对象上的任何其他属性指定架构。有时这还不够,您可能想要限制额外属性的名称,或者您可能想要说明,给定特定类型的名称,该值应与特定模式匹配。这就是patternProperties的用武之地:它是一个从正则表达式映射到模式的新关键字。如果附加属性与给定的正则表达式匹配,则它还必须根据相应的模式进行验证。

注意:定义正则表达式时,请务必注意表达式可能与属性名称中的任何位置匹配。例如,正则表达式“p”将匹配任何属性名称,其中包含p,例如“apple”,而不仅仅是名称为“p”的属性。因此,在^ ... $中包围正则表达式通常不那么令人困惑,例如“^ p $”。

供进一步参考 - http://spacetelescope.github.io/understanding-json-schema/reference/object.html

答案 2 :(得分:0)

属性的语义:

  • 如果声明属性中包含键的属性,则必须满足属性中声明的模式。

patternProperties的语义:

  • 如果声明属性并且键满足patternProperties中定义的正则表达式,则它必须满足patternProperties中声明的模式。

根据the docs,属性优先级高于patternProperties,这意味着只有在属性中没有匹配的情况下才会针对patternProperties验证模式。

答案 3 :(得分:0)

JSON对象由键:值对组成。在模式中,键对应于一个属性,对于值部分,我们定义它的数据类型和其他一些约束。

因此,以下架构

{ 
 "type": "object",
 "properties": {
    "a": {
        "type": "number"
    }
}

将仅使用密钥"a"验证JSON对象,该密钥是{"a": 1}之类的对象。像{"b": 1}这样的对象将无法验证

与此同时,patternProperties标记允许您使用正则表达式定义属性。在这种情况下,您基本上不需要一个接一个地定义所有属性。例如,如果您事先不知道键的名称,但您知道所有键都匹配特定的模式,则可以使用这种方法。

因此,您的架构可以验证{"a": 1}{"b": 1}

patternProperties标记完成了anotherProperties标记的工作,但除此之外,您还可以更好地控制按键