对象和属性
一个对象被括在大括号中,并将一个键映射到一个值,像这样:"MyKey": Value。键必须始终是一个字符串,因此必须用引号括起来。值可以是任何JSON数据类型。每个key:value对被称为对象的属性(参见下方截图)。
下方示例是一个实例化的对象,具有三个属性:
{
"emailtype": "home",
"emailaddress": "contact01.home@altova.com",
"citycode": 22
}
该对象的Schema在设计视图中看起来像这样:
请注意以下几点:
•每个属性都必须存在于实例中。这是由属性的实线边框指示的。如果属性是可选的,则边框为虚线。您可以在属性的上下文菜单或通过“详细信息”输入助手将属性设为必需或可选。
•属性必须在实例中出现的顺序在Schema中没有定义,也不能定义。这意味着在Schema中定义的属性顺序是无关紧要的。
•括号内的蓝色正方形符号表示属性(与模式属性或属性通配符不同,它们由其他符号表示:参见下文)。
•通过双击图表中的类型并从出现的下拉列表中选择一个选项可以对属性的类型进行编辑。或者,可以在“详细信息”输入助手中选择一个类型。
•emailaddress属性的约束值在“约束”输入助手中定义。
属性、模式属性、属性通配符和属性名称Schema
对象可以具有属性、模式属性、属性通配符和属性名称Schema(draft-07中的新功能)。这些可以通过这些上下文菜单添加到对象中:(i) 对象的上下文菜单;(ii) 黄色属性框的上下文菜单(右键单击框的属性标题,以及(iii) 各个属性的上下文菜单。上文已对属性作了说明。我们现在来看模式属性和属性通配符。
模式属性
模式属性(参见下方截图)将属性的名称定义为一个正则表达式。例如,在下方截图中,正则表达式指定属性必须:(i) 具有开头为下划线的名称,(ii) 将布尔值作为其值。模式属性没有约束。您可以设置任意数量的模式属性。请注意模式属性的图标。
属性通配符
属性通配符(参见下方截图)指定除了对象属性集的其他属性外,还可以有任意数量的属性。但是,通配符可用于为这些实例定义类型。左下方截图显示了一个属性通配符,它定义属性的名称不限,但其值必须是数值。每个对象只能有一个属性通配符。如果将通配符设为Any类型,则可以在“约束”输入助手中为每种类型设置约束。请注意属性通配符的图标。
从draft-2019-09版本开始,属性通配符有一个新的关键词unevaluatedProperties,仅在additionalProperties关键词缺失时才会处理该关键词。这两个关键词的值是通过在通配符的“详细信息”输入助手中为Specified、Applies to和Type条目设置适当的值生成的(参见下方截图)。
下表中解释了这些值对 unevaluatedProperties和additionalProperties关键词的影响(以及关键词对这些值的影响)。例如,在上方截图中,设置了unevaluatedProperties=true。
addtionalProperties | unevaluatedProperties |
| 是否已指定 | 范围 | 类型 |
-- | -- | <=> | false | 全部 | 不受约束 |
true | 忽略 | <=> | true | 全部 | 不受约束 |
false | 忽略 | <=> | -- | -- | -- |
Schema | 忽略 | <=> | true | 全部 | Schema类型 |
-- | true | <=> | true | 未计算 | 不受约束 |
-- | false | <=> | true | 未计算 | 禁止 |
-- | Schema | <=> | true | 未计算 | Schema类型 |
请注意以下几点:
•如果存在addtionalProperties和unevaluatedProperties,则unevaluatedProperties将被忽略。
•是否指定=false仅在范围=All和类型=Unconstrained时才能使用。
属性名称Schema
属性名称Schema(参见下方截图)对对象属性的名称进行约束。(此功能是draft-07中的新功能。)例如,在下方截图中,我们可以看到属性名称必须是字符串。此外,我们还可以通过“约束”输入助手对属性名称进行进一步的约束:例如,属性名称必须在特定的字符长度范围内,或必须具有特定的模式。
提示: | 对于模式属性或属性通配符,无法设置最少或最多出现的次数。如果需要进一步的说明,请参见属性验证部分。 |
如何验证属性
如果在实例中遇到属性,则按以下步骤对其进行验证:
1.将根据对象的所有命名的属性检查Schema中的属性名称。
2.如果未找到匹配项,则根据对象的属性集中所有的模式属性检查该名称。
3.如果仍然没有找到匹配项,则调用通配符(如果存在)。
4.如果仍然没有找到匹配的名称,则将报告验证错误。如果该名称与属性或模式属性的名称匹配,或存在通配符,则将根据相应属性定义的值检查其值。
5.如果实例值与对应属性定义的类型和约束匹配,则该属性是有效的。否则无效。
示例
下方截图定义了一个对象:
•必须具有三个属性,它们分别名为emailtype、emailaddress和citycode。
•可以具有一个或多个属性,其名称必须以下划线开头,并且其值必须是布尔值(参见下方截图中的模式模型)。
•可以具有一个或多个附加的属性,名称不限,值不限。