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

Ash*_*nan 5 jsonschema

对于以下json字符串:

{
    "abc" : 123,
    "def" : 345
}
Run Code Online (Sandbox Code Playgroud)

以下架构认为它有效:

{
    "$schema": "http://json-schema.org/draft-03/schema#",
    "title": "My Schema",
    "description": "Blah",
    "type": "object",
    "patternProperties": {
        ".+": {
            "type": "number"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

esp*_*esp 6

对于上面的模式,所有属性都应该是数字.此数据无效:

{ a: 'a' }
Run Code Online (Sandbox Code Playgroud)

如果使用属性替换patternProperties,则属性'.+'应为数字.所有其他属性可以是任何东西.这将是无效的:

{ '.+': 'a' }
Run Code Online (Sandbox Code Playgroud)

这是有效的:

{ a: 'a' }
Run Code Online (Sandbox Code Playgroud)


小智 2

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

\n\n

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

\n\n

注意:定义正则表达式时,请务必注意该表达式可能与属性名称中的任何位置匹配。例如,正则表达式“p”将匹配任何包含 ap 的属性名称,例如“apple”,而不仅仅是名称简单为“p”的属性。因此,将正则表达式括在 ^...$ 中通常不会那么混乱,例如“^p$”。

\n\n

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

\n