Json 复杂结构的架构有效性

Json schema validade for complex structure

嗨,我需要帮助生成一个 json 模式来验证表单,下面的例子是一个成员数组,有很多成员类型,类型 1 是

项目经理,2 类系统分析师,3 类是开发人员。我需要验证项目是否包含成员列表: 类型 1 的最小值 1 和最大值 1; 最小 1 最大 2 类型 2; 最小 2 最大 2 类型 3.

 {
"members": [
    {
        "memberid": 1,
        "membername": "John",
        "type": 1
    },
    {
        "memberid": 2,
        "membername": "Jack",
        "type": 2
    },
    {
        "memberid": 3,
        "membername": "Peter",
        "type": 3
    },
    {
        "memberid": 4,
        "membername": "Jorge",
        "type": 3
    },
    {
        "memberid": 5,
        "membername": "Clay",
        "type": 3
    }
]

}

这是一个艰难的过程。此解决方案的唯一限制是它要求成员按特定顺序排列。此外,如果将来需要其他组合,架构可能会失控。

{
  "type": "object",
  "properties": {
    "members": { "$ref": "#/definitions/members" }
  },
  "definitions": {
    "members": {
      "oneOf": [
        { "$ref": "#/definitions/smallTeam" },
        { "$ref": "#/definitions/largeTeam" }
      ]
    },
    "smallTeam": {
      "type": "array",
      "items": [
        { "$ref": "#/definitions/projectManager" },
        { "$ref": "#/definitions/systemAnalyst" },
        { "$ref": "#/definitions/developer" },
        { "$ref": "#/definitions/developer" }
      ],
      "additionalItems": false
    },
    "largeTeam": {
      "type": "array",
      "items": [
        { "$ref": "#/definitions/projectManager" },
        { "$ref": "#/definitions/systemAnalyst" },
        { "$ref": "#/definitions/systemAnalyst" },
        { "$ref": "#/definitions/developer" },
        { "$ref": "#/definitions/developer" }
      ],
      "additionalItems": false
    },
    "projectManager": {
      "type": "object",
      "allOf": [{ "$ref": "#/definitions/member" }],
      "properties": {
        "type": { "enum": [1] }
      }
    },
    "systemAnalyst": {
      "type": "object",
      "allOf": [{ "$ref": "#/definitions/member" }],
      "properties": {
        "type": { "enum": [2] }
      }
    },
    "developer": {
      "type": "object",
      "allOf": [{ "$ref": "#/definitions/member" }],
      "properties": {
        "type": { "enum": [3] }
      }
    },
    "member": {
      "type": "object",
      "properties": {
        "memberid": { "type": "integer" },
        "membername": { "type": "string" }
      },
      "required": ["memberid", "membername", "type"]
    }
  }
}

你能控制这个结构吗?如果稍微有点不同,就更容易描述了。

{
  "type": "object",
  "properties": {
    "projectManager": { "$ref": "#/definitions/member" },
    "systemAnalyst": {
      "type": "array",
      "items": { "$ref": "#/definitions/member" },
      "minItems": 1,
      "maxItems": 2
    },
    "developer": {
      "type": "array",
      "items": { "$ref": "#/definitions/member" },
      "minItems": 1,
      "maxItems": 2
    }
  },
  "definitions": {
    "member": {
      "type": "object",
      "properties": {
        "memberid": { "type": "integer" },
        "membername": { "type": "string" }
      }
    }
  }
}