JSON模式草案7验证数组对象中的必需属性时出现问题

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

我有一个JSON模式文件(缩小为不显示与问题无关的内容):

我要验证的JSON是:

{
  "description": "description",
  "requesteeName": "05300005",
  "processOrder": [
  {"cleanHistory": {} },
    {"processEvents": {
      "identityTrigger": "some trigger"
    }}
  ],
  "deleteObjects": "true"
}
现在,我希望在删除字符串时它会失败:

“identityTrigger”:“某些触发器”

因为“identityTrigger”属性位于processEvents对象中所需的数组中。但它并没有失败,数组匹配(processOrder数组)中一定有错误。 有人能给我一个建议吗?
谢谢

正如@Carsten在评论中所说的那样,我已经设法更好地理解了它是如何工作的,因为任何带有任何属性的项目都会被验证,所以带有单个项目但没有必需属性的任何项目都不起作用。 正确的模式应该是(更改以粗体显示):

主要变化有2个:

  • 在数组对象定义中添加了“additionalItems”:false
  • 添加了“必需”:[“cleanHistory”]“required”:[“processEvents”]对于每个对应的根属性项,在我的情况下(“cleanHistory”和“processEvents”),这样AnyOf将强制使用列出的模式之一来验证数组中的项

  • 正如@Carsten在评论中所说的那样,我已经设法更好地理解了它是如何工作的,因为任何带有任何属性的项目都会被验证,因此带有不需要属性的单个项目的anyOf不起作用。 正确的模式应该是(更改以粗体显示):

    主要变化有2个:

  • 在数组对象定义中添加了“additionalItems”:false
  • 添加了“必需”:[“cleanHistory”]“required”:[“processEvents”]对于每个对应的根属性项,在我的情况下(“cleanHistory”和“processEvents”),这样AnyOf将强制使用列出的模式之一来验证数组中的项

  • 验证仍然成功的原因是第一个
    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"
          }
        }
      }
    }