我如何通知 Json 模式它的数组中必须至少有一种类型的对象,但其他类型是可选的

How do I inform a Json schema that it must have atleast one type of object in its Array, but other types are optional

我正在为工作更新 JSON 架构。

对于json数组,我们有

"accountsInfo": [{
    "type":"ADMIN",
    "firstName":"Bill",
    "lastName":"Cipher",
    "emailAddress":"bcipher@gfalls.com"

}, {
    "type":"USER"
    "firstName":"Bugs",
    "lastName":"Bunny",
    "emailAddress":"whats@updoc.org"
}]

对于此架构,USER 类型必须是可选的,数组中至少需要 1 个 ADMIN 类型。我该怎么做?

这是架构文件的一部分。它正在使用 Json 架构 7.

  "accountsInfo": {
    "type": "array",
    "uniqueItems": true,
    "minItems": 2,
    "items": [
      {
        "type": "object",
        "required": [
          "type",
          "firstName",
          "lastName",
          "emailAddress"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "ADMIN",
              "USER"
            ]
          },
          "firstName": {
            "type": "string",
            "$ref": "#/definitions/non-empty-string"
          },
          "lastName": {
            "type": "string",
            "$ref": "#/definitions/non-empty-string"
          },
          "emailAddress": {
            "type": "string",
            "format": "email"
          }
        }
      }
    ]
  }

您可以为此使用“包含”关键字。在伪代码中:“该数组必须包含(至少一个)根据此模式成功评估的项目”。

作为 "type": "object""items": { ... } 的同级关键字,添加:

"contains": {
  "properties": {
    "type": {
      "const": "ADMIN"
    }
  }
}

此外,您的 "items" 关键字中有一个错误:如果您打算让该子模式匹配 所有 项,而不仅仅是第一个,请删除额外的数组围绕模式。 “items”的数组形式依次将数据中的每个项目与架构中的每个项目进行匹配,并且您只需为第一个项目指定一个架构,因此第一个之后的所有项目都可以是任何东西。

"items": { .. schema .. } 不是 "items": [ { .. schema .. } ]

如果按照建议使用 contains 关键字,并且使用严格模式,则可能需要添加 "type": "array" ,如下所示:

  {
    "type": "array",
    "contains": {
      "properties": {
        "type": {
          "const": "ADMIN"
        }
      }
    }
  }