JsonSchema - 如果定义了另一个数组字段,则只允许数组字段中的一个项目

JsonSchema - Only allow one item in an array field if another array field is defined

我有以下 json,如果存在“tokens”数组(至少有一个项目),我只想允许“leads”只包含一个“id”项目。

JSON

{
"input": {
    "leads": [
        {
            "id": 795333333760
        }
    ],
    "tokens": [
      {
        "name": "tem_x",
        "value": "Renew_all"
      },
      { 
        "duration": "90",
        "eligibility": "eligible"
      }
    ]
}

我有以下架构,表明“令牌”可以有多个项目(如果存在)并且“线索”是必需的。

"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
  "input": {
    "type": "object",
    "properties": {
      "leads": {
        "type": "array",
        "items": [
          {
            "type": "object",
            "properties": {
              "id": {
                "type": "integer"
              }
            },
            "required": [
              "id"
            ]
          }
        ]
      },
      "tokens": {
        "type": "array",
        "minItems": 1
      
      }
    },
    "required": [
      "leads",
    ]
  }
},
"required": [
  "input"
]
}

如果存在“tokens”(因为它未定义为必填字段),是否有办法确保“leads”中仅允许一个项目。如果没有定义“tokens”,那么我想允许“leads”数组有一个以上的项目。

我试过 if-then 但没能正常工作。任何帮助表示赞赏。 谢谢。

尝试这样使用:

    {
      "properties": {
        "tokens": {},
        "leads": {}
      },
      "anyOf": [{
        "required" : ["tokens"]
      }, {
        "required" : ["leads"]
      }]
    }

so schema looks like this:

"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
  "input": {
    "type": "object",
    "properties": {
      "leads": {
        "type": "array",
        "items": [
          {
            "type": "object",
            "properties": {
              "id": {
                "type": "integer"
              }
            },
            "required": [
              "id"
            ]
          }
        ]
      },
      "tokens": {
        "type": "array",
        "minItems": 1
      
      }
    },
    "anyOf": [{
    "required" : ["tokens"]
  }, {
    "required" : ["leads"]
  }]
  }
},
"required": [
  "input"
]
}

这就是 dependencies 关键字的用途。它也可以用 if/then 或暗示来完成,但是 dependencies 删除了这些模式所需的所有额外样板。下面说,如果定义了“tokens”属性,那么“leads”属性 最多必须有 1 个项目。这将进入您的“输入”模式。

"dependencies": {
  "tokens": {
    "properties": {
      "leads": { "maxItems": 1 }
    }
  }
}

编辑dependencies 适用于 draft-04 至 draft-07。在 2019-09 及以后的草案中,您可以改用 dependentSchemas