JSON模式草案7验证数组对象中的必需属性时出现问题
我有一个JSON模式文件(缩小为不显示与问题无关的内容): 我要验证的JSON是:JSON模式草案7验证数组对象中的必需属性时出现问题,json,jsonschema,json-schema-validator,Json,Jsonschema,Json Schema Validator,我有一个JSON模式文件(缩小为不显示与问题无关的内容): 我要验证的JSON是: { "description": "description", "requesteeName": "05300005", "processOrder": [ {"cleanHistory": {} }, {"processEvents": { "identityTrigger": "some trigger" }} ], "deleteObjects": "tr
{
"description": "description",
"requesteeName": "05300005",
"processOrder": [
{"cleanHistory": {} },
{"processEvents": {
"identityTrigger": "some trigger"
}}
],
"deleteObjects": "true"
}
现在,我希望在删除字符串时它会失败:
“identityTrigger”:“某些触发器”
因为“identityTrigger”属性位于processEvents对象中所需的数组中。但它并没有失败,数组匹配(processOrder数组)中一定有错误。
有人能给我一个建议吗?
谢谢正如@Carsten在评论中所说的那样,我已经设法更好地理解了它是如何工作的,因为任何带有任何属性的项目都会被验证,所以带有单个项目但没有必需属性的任何项目都不起作用。 正确的模式应该是(更改以粗体显示): 主要变化有2个:
正如@Carsten在评论中所说的那样,我已经设法更好地理解了它是如何工作的,因为任何带有任何属性的项目都会被验证,因此带有不需要属性的单个项目的anyOf不起作用。 正确的模式应该是(更改以粗体显示): 主要变化有2个:
验证仍然成功的原因是第一个
anyOf
选项在允许任何附加属性时未指定任何必需的属性,因此空JSON对象始终对第一个选项有效。
修复方法是期望每个anyOf
中至少有一个属性,以避免空对象对其中任何一个都有效
然而,这里似乎还有一些额外的要点可以从澄清中受益:
默认情况下,additionalProperties
关键字为true
,在这种情况下不需要提及。根据:
additionalProperties
关键字用于控制额外内容的处理,即名称未列在properties
关键字中的属性。默认情况下,允许任何其他属性
additionalItems
关键字仅适用于items
是数组(即数组是位于特定位置的不同类型的元组)的情况。根据:
当items
是单个模式时,additionalItems
关键字没有意义,不应使用
您的默认值
是空对象,对于所描述的具有必需属性的结构无效。最好也保留那些默认值
值,除非这仅仅是因为您删除了此处问题范围内的内容以保持简单
验证仍然成功的原因是第一个anyOf
选项在允许任何附加属性时未指定任何必需的属性,因此空JSON对象始终对第一个选项有效。
修复方法是期望每个anyOf
中至少有一个属性,以避免空对象对其中任何一个都有效
然而,这里似乎还有一些额外的要点可以从澄清中受益:
默认情况下,additionalProperties
关键字为true
,在这种情况下不需要提及。根据:
additionalProperties
关键字用于控制额外内容的处理,即名称未列在properties
关键字中的属性。默认情况下,允许任何其他属性
additionalItems
关键字仅适用于items
是数组(即数组是位于特定位置的不同类型的元组)的情况。根据:
当items
是单个模式时,additionalItems
关键字没有意义,不应使用
您的默认值
是空对象,对于所描述的具有必需属性的结构无效。最好也保留那些默认值
值,除非这仅仅是因为您删除了此处问题范围内的内容以保持简单
如果删除“identityTrigger”属性,该JSON示例仍会根据第一个anyOf
选项进行验证,因为该选项没有定义所需的属性。@Carsten Ok,但是,当processOrder元素中的processEvent对象没有eventTrigger属性时,我应该如何设置模式使其失败?如果删除“identityTrigger”属性,JSON示例仍然根据第一个anyOf
选项进行验证,因为该选项没有定义所需的属性。@Carsten Ok,但是,当processOrder元素中有processEvent对象而没有eventTrigger属性时,我应该如何设置模式以使其失败?
{
"description": "description",
"requesteeName": "05300005",
"processOrder": [
{"cleanHistory": {} },
{"processEvents": {
"identityTrigger": "some trigger"
}}
],
"deleteObjects": "true"
}
{
"$schema": "http://json-schema.org/draft-07/schema",
"$id": "urn:jsonschema:testing:frmwk",
"type": "object",
"title": "The root schema",
"default": {},
"required": [
"processOrder"
],
"additionalProperties": true,
"properties": {
"processOrder": {
"$id": "#processOrder",
"type": "array",
"title": "The processOrder schema",
"default": [],
"additionalItems": false,
"items": {
"anyOf": [
{
"$id": "#0",
"type": "object",
"title": "The first anyOf schema",
"default": {},
"additionalProperties": true,
"required": ["cleanHistory"],
"properties": {
"cleanHistory": {
"$id": "#cleanHistory",
"type": "object",
"title": "The cleanHistory schema",
"default": {},
"additionalProperties": true,
"properties": {}
}
}
},
{
"$id": "#3",
"type": "object",
"title": "The fourth anyOf schema",
"default": {},
"additionalProperties": true,
"required": ["processEvents"],
"properties": {
"processEvents": {
"$id": "#processEvents",
"type": "object",
"title": "The processEvents schema",
"default": {},
"required": [
"identityTrigger"
],
"additionalProperties": true,
"properties": {
"identityTrigger": {
"$id": "#identityTrigger",
"type": "string",
"title": "The identityTrigger schema",
"default": ""
}
}
}
}
}
],
"$id": "#items"
}
}
}
}