如何确保数组中只有一项在 JSON 模式中具有特定值

How to ensure that no more than one item in an array has a particular value in JSON schema

给定一个像这样的 JSON 数组:

[
  {
    "description": "Foo",
    "selected": false
  },
  {
    "description": "Bar",
    "selected": true
  },
  {
    "description": "Baz",
    "selected": false
  }
]

使用此模式验证:

{
  "$schema": "http://json-schema.org/draft/2019-09/schema",
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "description": {
        "type": "string",
        "minLength": 1
      },
      "selected": {
        "type": "boolean"
      }
    },
    "required": [
      "description",
      "selected"
    ]
  }
}

如何修改架构,以便仅当不超过一个项目的 selected 属性 设置为 true 时数组才能通过验证?也就是说,具有该值的零个或一个对象将被视为有效,但两个或更多对象将被视为无效。

您可以使用 contains/minContains/maxContains 关键字来执行此操作。 contains 表示数组中至少有一项必须通过给定的模式。 minContainsmaxContains 允许您指定 contains 可以匹配的项目数的上限和下限。

以下架构表示,数组中必须有 0 到 1 个项目,这些项目是一个名为“selected”的 属性 对象,其值为 true

{
  ...
  "contains": {
    "type": "object",
    "properties": {
      "selected": { "const": true }
    },
    "required": ["selected"]
  },
  "minContains": 0,
  "maxContains": 1
}

请注意,minContainsmaxContains 是 2019-09 草案中的新内容。在此之前,没有很好的方法来限制 contains 可以匹配的项目数。在 https://json-schema.hyperjump.io

试试