对于以下json字符串:
{
"abc" : 123,
"def" : 345
}
以下架构认为它有效:
{
"$schema": "http://json-schema.org/draft-03/schema#",
"title": "My Schema",
"description": "Blah",
"type": "object",
"patternProperties": {
".+": {
"type": "number"
}
}
}
但是,将patternProperties更改为属性仍认为它有效。那么,这两个标签之间的区别是什么?
答案 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的语义:
根据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标记的工作,但除此之外,您还可以更好地控制按键