JSON-架构对象数组验证

JSON-schema object array validation

我的任务是验证这样的 JSON 消息 :

{
  "header": {
    "action": "change_time",
    "taskGuid": "someTaskGuid",
    "publishDate": "2012-04-23T18:25:43.511Z"
  },
  "data": {
    "code": "f2103839",
    "conditions": [
      {
        "conditionsType": "A",
        "dateBegin": "2021-11-22T17:30:43.511Z",
        "dateEnd": "2021-11-22T17:35:43.511Z"
      },
      {
        "conditionsType": "B",
        "dateBegin": "2021-11-22T17:30:43.511Z",
        "dateEnd": "2021-11-22T17:35:43.511Z"
      },
      {
        "conditionsType": "C",
        "dateBegin": "2021-11-22T17:30:43.511Z",
        "dateEnd": "2021-11-22T17:35:43.511Z"
      }
    ]
  }
}

我做了这样一个 JSON-schema 来实现 :

{
  "$schema": "http://json-schema.org/draft-07/schema",
  "title": "Some schema",
  "description": "Some schema",
  "type": "object",
  "required": [
    "header",
    "data"
  ],
  "properties": {
    "header": {
      "type": "object",
      "required": [
        "action",
        "taskGuid",
        "publishDate"
      ],
      "properties": {
        "action": {
          "enum": [
            "create_work_order",
            "change_time",
            "cancel_work"
          ]
        },
        "taskGuid": {
          "type": "string"
        },
        "publishDate": {
          "type": "string",
          "format": "date-time"
        }
      }
    },
    "data": {
      "type": "object",
      "required": [
        "code",
        "conditions"
      ],
      "properties": {
        "code": {
          "type": "string"
        },
        "conditions": {
          "type": "array",
          "items": [
            {
              "conditionsType": "object",
              "properties": {
                "type": {
                  "enum": [
                    "A",
                    "B",
                    "C"
                  ]
                },
                "dateBegin": {
                  "type": "string",
                  "format": "date-time"
                },
                "dateEnd": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "required": [
                "conditionsType",
                "dateBegin",
                "dateEnd"
              ]
            }
          ]
        }
      }
    }
  }
}

conditions 数组将由 items 描述的 1-3 个对象组成。每个对象都应该有一个唯一的 conditionsType.

我正在使用此仪器检查验证 - https://www.jsonschemavalidator.net/

问题是这个模式确实验证了消息,但是只有数组的第一个对象被处理为de。例如,这样的 JSON 也被验证(参见“条件”对象 #2):

{
  "header": {
    "action": "change_time",
    "taskGuid": "someTaskGuid",
    "publishDate": "2012-04-23T18:25:43.511Z"
  },
  "data": {
    "code": "f2103839",
    "conditions": [
      {
        "conditionsType": "A",
        "dateBegin": "2021-11-22T17:30:43.511Z",
        "dateEnd": "2021-11-22T17:35:43.511Z"
      },
      {
        "conditionsType": 123,
        "dateBegin": [1,2,3],
        "dateEnd": 1
      },
      {
        "conditionsType": "C",
        "dateBegin": "2021-11-22T17:30:43.511Z",
        "dateEnd": "2021-11-22T17:35:43.511Z"
      }
    ]
  }
}

这真的是我为这项任务选择的正确方向吗?

两件事。您的 items 架构中有一个拼写错误,您实际上想要 type 而不是 conditionsType。其次,如果 items 关键字是一个数组,则数组的项目将按此顺序针对模式进行验证。您希望将 items 关键字作为单个架构,然后应用于所有项目。 copy-paste 的更正架构:

{"$schema":"http://json-schema.org/draft-07/schema","title":"Some schema","description":"Some schema","type":"object","required":["header","data"],"properties":{"header":{"type":"object","required":["action","taskGuid","publishDate"],"properties":{"action":{"enum":["create_work_order","change_time","cancel_work"]},"taskGuid":{"type":"string"},"publishDate":{"type":"string","format":"date-time"}}},"data":{"type":"object","required":["code","conditions"],"properties":{"code":{"type":"string"},"conditions":{"type":"array","items":{"type":"object","properties":{"conditionsType":{"enum":["A","B","C"]},"dateBegin":{"type":"string","format":"date-time"},"dateEnd":{"type":"string","format":"date-time"}},"required":["conditionsType","dateBegin","dateEnd"]}}}}}}