为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕田峪4524236 2023-03-02 14:58:04
我的 JSON 负载包含两个属性home_number,home_name并且始终至少需要一个属性。除此之外,这些属性还有以下附加约束。home_number:类型:字符串,最大长度:4home_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}draft-07我使用if, then关键字尝试了以下带有版本的 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                        }                    }                }            },我的问题是有没有其他/更好的方法来实现这个使用draft-04版本而不使用draft-07if then 关键字?
查看完整描述

1 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

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


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


请阅读(链接到我自己过去的回答并不优雅,但它可能会引导您进一步阅读):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"

      }

    },

  ]

}



查看完整回答
反对 回复 2023-03-02
  • 1 回答
  • 0 关注
  • 163 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信