jsonSchema 来验证有条件的必需属性

jsonSchema to validate conditionally required attributes

我的 JSON 负载包含两个属性 home_numberhome_name 至少需要一个属性 。除此之外,这些属性还有以下附加限制。

home_number: type: string, Max length: 4

home_name: type: string, Max length: 50

JSON 如果两个属性都不满足要求,模式应该抛出错误

例如:

有效JSON

{
    "home_number": "1234", // valid
}

有效JSON

{
    "home_number": null, // invalid
    "home_name": "test_home_name" // valid
}

无效JSON

{
    "home_number": "12345", // invalid
    "home_name": null // invalid
}

我使用 if, then 关键字尝试了 draft-07 版本的以下 JSON 模式。

{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "properties": {
        "address": {
            "$ref": "#/definitions/address",
            "properties": {
                "house_number": {
                    "$ref": "#/definitions/address/house_number"
                },
                "house_name": {
                    "$ref": "#/definitions/address/house_name"
                },
                "post_code": {
                    "$ref": "#/definitions/address/postcode"
                }
            }
        }
    },
    "required": [
        "address"
    ],
    "definitions": {
        "address": {
            "type": "object",
            "properties": {
                "postcode": {
                    "type": "string",
                    "maxLength": 6
                }
            },
            "anyOf": [
                {
                    "required": [
                        "house_number"
                    ]
                },
                {
                    "required": [
                        "house_name"
                    ]
                }
            ],
            "if": {
                "properties": {
                    "house_name": {
                        "not": {
                            "type": "string",
                            "maxLength": 50
                        }
                    }
                }
            },
            "then": {
                "properties": {
                    "house_number": {
                        "type": "string",
                        "maxLength": 4
                    }
                }
            },
            "required": [
                "postcode"
            ]
        }
    }
}

我的问题是有没有 other/better 方法来实现这个 使用 draft-04 版本而不使用 draft-07 if then keywords?

正如评论中所指出的,这可能已被多次询问。

使用逻辑运算符可以解决以下问题、架构和 json 示例。我不能说它是否更好,它只是将 "anyOf" 内的任何内容分组(以及您可以在需要时添加的邮政编码的要求,并且您可以根据需要构建对完整 "properties" 内部的引用希望等)。或者您可以将其作为严格的 XOR "oneOf"(也如评论中所述)并确保每个案例的地址->属性定义都根据您的需要进行调整。

请阅读(链接到我自己过去的回答并不优雅,但可能会引导您进一步阅读):

针对您的问题(据我了解)的简化架构和示例:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties" : {
    "address": {
      "type" : "object",
      "anyOf" : [
        { 
          "properties" : {
            "house_number" : {
              "type":"string",
              "maxLength": 4
            },
          },
          "required":["house_number"]
        },
        { 
          properties : {
            "house_name" : {
              "type" : "string",
                "maxLength" : 50
            }
          },
          "required":["house_name"]
        }
      ]
    }
  },
  required: ["address"],
  examples : [
    {
      baddress: {
      }
    },
    {
      address: {
        "house_number":"1234",
        "house_name" : null
      }
    },
    {
      address: {
        "house_number":null,
        "house_name" : null
      }
    },
    {
      address: {
        "house_number":null,
        "house_name" : "some name"
      }
    },
    {
      address: {
        "house_number": "12345",
        "house_name" : "some afafafasagagagffgfsagragsgasgasssssssfdgsdfgsdfgdsgsdfgsdgsdfgdfsgsdfgs name"
      }
    },
  ]
}