Json 需要数组中的特定项

Json 需要数组中的特定项,json,jsonschema,Json,Jsonschema,我有以下json对象: { "my_items": [ { "a": "primary", n: 1 }, { "b": "secondary", n: 2 }, { "b": "secondary", n: 3 } ] } my_items列表中的所有项目都应该是唯一的。现在,我需要使用以下规则验证整个json对象: 它可以包含零个或多个带有“type”:“secondary”,但绝对必须包含一个且仅包含一个带有“type”:“primary” 如何使用最新版

我有以下
json
对象:

{
  "my_items": [
    { "a": "primary", n: 1 },
    { "b": "secondary", n: 2 },
    { "b": "secondary", n: 3 }
  ]
}
my_items
列表中的所有项目都应该是唯一的。现在,我需要使用以下规则验证整个
json
对象:

它可以包含零个或多个带有
“type”:“secondary”
,但绝对必须包含一个且仅包含一个带有
“type”:“primary”

如何使用最新版本来表达这一点

我想到了:

但测试失败,出现以下错误:

Invalid: data.my_items[0] should NOT have additional properties, data.my_items[1] should NOT have additional properties, data.my_items[2] should NOT have additional properties

在JSON模式中,无法断言数组包含且仅包含某个内容中的一个。你可以断言至少有一个,但这是你能做的最好的。最接近的方法是要求主_项是数组中的第一个元素

{
  "type": "object",
  "properties": {
    "my_items": {
      "type": "array",
      "items": [
        {"$ref": "#/definitions/primary_item"}
      ],
      "additionalItems": {"$ref": "#/definitions/secondary_item"}
    }
  },
  "additionalProperties": false,
  "definitions": {
    "primary_item": {
      "type": "object",
      "properties": {
        "a": { "enum":["primary"] }
      },
      "additionalProperties": false
    },
    "secondary_item": {
      "type": "object",
      "properties": {
        "b": { "enum":["secondary"] }
      },
      "additionalProperties": false
    }
  }
}
编辑

回应评论

我想知道是否可以用两个概念来表达一个和唯一一个:
至少一个
+
唯一的

对。如果数组项是唯一的,则可以执行以下操作

{
  "type": "object",
  "properties": {
    "my_items": {
      "type": "array",
      "items": { "$ref": "#/definitions/my_item" },
      "allOf": [{"$ref": "#/definitions/contains_primary_item"}],
      "uniqueItems": true
    }
  },
  "additionalProperties": false,
  "definitions": {
    "my_item": {
      "type": "object",
      "properties": {
        "a": { "type": "string" }
      },
      "additionalProperties": false
    },
    "primary_item": {
      "type": "object",
      "properties": {
        "a": { "enum":["primary"] }
      },
      "additionalProperties": false
    },
    "contains_primary_item": {
      "not": {
        "items": {
          "not": { "$ref": "#/definitions/primary_item" }
        }
      }
    }
  }
}

在JSON模式中,无法断言数组包含且仅包含某个内容中的一个。你可以断言至少有一个,但这是你能做的最好的。最接近的方法是要求主_项是数组中的第一个元素

{
  "type": "object",
  "properties": {
    "my_items": {
      "type": "array",
      "items": [
        {"$ref": "#/definitions/primary_item"}
      ],
      "additionalItems": {"$ref": "#/definitions/secondary_item"}
    }
  },
  "additionalProperties": false,
  "definitions": {
    "primary_item": {
      "type": "object",
      "properties": {
        "a": { "enum":["primary"] }
      },
      "additionalProperties": false
    },
    "secondary_item": {
      "type": "object",
      "properties": {
        "b": { "enum":["secondary"] }
      },
      "additionalProperties": false
    }
  }
}
编辑

回应评论

我想知道是否可以用两个概念来表达一个和唯一一个:
至少一个
+
唯一的

对。如果数组项是唯一的,则可以执行以下操作

{
  "type": "object",
  "properties": {
    "my_items": {
      "type": "array",
      "items": { "$ref": "#/definitions/my_item" },
      "allOf": [{"$ref": "#/definitions/contains_primary_item"}],
      "uniqueItems": true
    }
  },
  "additionalProperties": false,
  "definitions": {
    "my_item": {
      "type": "object",
      "properties": {
        "a": { "type": "string" }
      },
      "additionalProperties": false
    },
    "primary_item": {
      "type": "object",
      "properties": {
        "a": { "enum":["primary"] }
      },
      "additionalProperties": false
    },
    "contains_primary_item": {
      "not": {
        "items": {
          "not": { "$ref": "#/definitions/primary_item" }
        }
      }
    }
  }
}
我想知道是否只有一个可以用两个概念来表达:
至少一个
+
唯一的
。你怎么认为?事实上,我认为列表中的所有对象都是唯一的(而我的示例暗示我可能有重复的对象,这不是真的;我已经更新了这个问题)。我想知道是否可以使用两个概念来表示一个对象,并且只有一个对象:
至少一个
+
唯一的
。你怎么认为?事实上,我认为列表中的所有对象都是唯一的(而我的示例暗示我可能有重复的对象,这不是真的;我已经更新了问题)。