首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSON-schema对象数组验证

JSON-schema对象数组验证
EN

Stack Overflow用户
提问于 2022-03-04 07:33:13
回答 1查看 345关注 0票数 0

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

代码语言:javascript
复制
{
  "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模式来实现

代码语言:javascript
复制
{
  "$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):

代码语言:javascript
复制
{
  "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"
      }
    ]
  }
}

这就是我为这个任务选择的正确方向吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-04 08:33:30

两件事。在您的items模式中有一个错误,您实际上想要的是type而不是conditionsType。其次,如果items关键字是数组,则数组的项将按照此顺序根据模式进行验证。您希望将items关键字作为一个单独的模式,然后应用于所有项。您修改的复制粘贴模式:

代码语言:javascript
复制
{"$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"]}}}}}}

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71347952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档