JSON Schema:如何要求拥有其中一个属性名称,或者没有一个属性名称和任何不同的名称?

时间:2016-11-03 16:04:43

标签: json validation jsonschema

msgId1必须a1msgId2必须a2

这应该是有效的:

{ "msgId1": { "a1": "b1" } }

这也是:

{ "msgId2": { "a2": "b2" } }

而且:

{ "msgIdUnknownYet": { "a3": "b3" } }

那是无效的:

{
    "msgId1": { "a1": "b1" },
    "msgId2": { "a2": "b2" }
}

那也应该是无效的:

{
    "msgId1": { "abc": "b1" },
    "msgId2": { "a2": "b2" }
}

如果我使用oneOf,则不允许使用未知消息。如果至少有一个右msgId1存在,它还允许添加错误的msgId2msgId。如何为其编写架构?

2 个答案:

答案 0 :(得分:0)

您可以使用dependencies

{
  "type": "object",
  "properties": {
    "msgId1": { "required": ["a1"] },
    "msgId2": { "required": ["a2"] }
  },
  "dependencies": {
    "msgId1": { "not": { "required": ["msgId2"] } }
  }
}

这有效地说明了如果" msgId1"存在,那么" msgId2"不能出席。这样,如果没有" msgId1"它仍然会通过。或" msgId2"在场。

答案 1 :(得分:0)

如果有办法隔离它们并限制属性总数,则可以使用。这告诉:如果有一个具有此类名称的属性,则它必须具有该特定表单,并且属性总数不超过1.

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "definitions": {
    "header": {
        "type": "object",
        "properties": {
            "id": { "type": "integer" }
        },
        "required": ["id"]
    },
    "messageHeader": {
        "type": "object",
        "properties": {
            "token": { "type": "string" }
        },
        "required": ["token"]
    },
    "msgId1": {
      "type": "object",
      "properties": { "a1": { "type": "string" } },
      "required": ["a1"]
    },
    "msgId2": {
      "type": "object",
      "properties": { "a2": { "type": "string" } },
      "required": ["a2"]
    }
  },

  "type": "object",
  "dependencies": {
    "msgId1": { "type": "object", "properties": { "msgId1": { "$ref": "#/definitions/msgId1" } } },
    "msgId2": { "type": "object", "properties": { "msgId2": { "$ref": "#/definitions/msgId2" } } }
  },
  "maxProperties": 1
}