jsonSchema验证条件必需的属性

时间:2019-07-02 12:03:14

标签: java json jsonschema

我的JSON有效负载包含两个属性home_numberhome_name始终至少需要一个属性。除此之外,这些属性还具有以下附加约束。

  

home_number:类型:字符串,最大长度:4

     

home_name:类型:字符串,最大长度: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,然后关键字尝试了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"
            ]
        }
    }
}

我的问题是,是否有其他/更好的方法来实现这一目标 使用draft-04版本而不使用draft-07如果关键字呢?

1 个答案:

答案 0 :(得分:0)

正如评论中指出的那样,这可能已经被问过多次了。

使用逻辑运算符可完成以下技巧,模式和json示例。我不能说它是否更好,它只是将“ anyOf”中的任何内容分组(以及您可以在需要时添加的邮政编码要求,并且可以根据需要构造对完整“属性”的引用等)。 )。或者,您可以将其表示为严格的XOR“ oneOf”(也如注释中所述),并确保每种情况下的address-> properties定义都可以根据需要调整形状。

请阅读(链接到我过去的回答虽然不够经典,但可能会导致您进一步阅读):JSON Schema conditional: require and not require

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

{
  "$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"
      }
    },
  ]
}