How to define choice element in json schema when elements are optional?

我们两清 提交于 2019-12-18 07:46:07

问题


------------Josn schema-----------

{
    "type": "object",
    "properties": {
        "street_address": {
            "type": "string"
        },
        "city": {
            "type": "string"
        },
        "state": {
            "type": "string"
        }
    },
    "required": [
        "street_address"
    ],
    "additionalProperties": false
}

In above schema i want to create a choice between city and state. That is either city or state can come in json. So that below json would be invalid

{
    "street_address": "abc",
    "city": "anv",
    "state": "opi"
}

and below one should be valid one

{
    "street_address": "abc"
}

or

{
    "street_address": "abc",
    "city": "anv"
}

or

{
    "street_address": "abc",
    "state": "opi"
}

Can some one please help me to modify above schema to accomplish the goal.


回答1:


Use "oneOf" when only one of the alternatives should hold, and "anyOf" when at least one of the alternatives should hold.

You don't need to repeat common properties within oneOf. The shortest way to accomplish your goal would be:

{
    "type" : "object",
    "properties" : {
        "street_address" : {
            "type" : "string"
        },
        "city" : {
            "type" : "string"
        },
        "state" : {
            "type" : "string"
        }
    },
    "oneOf" : [{
            "required" : ["city"]
        }, {
            "required" : ["state"]
        }
    ],
    "required" : [
        "street_address"
    ],
    "additionalProperties" : false
}



回答2:


You would need to use "oneOf". Like so:

{
    "type": "object",
    "oneOf": [
        {
            "properties": {
                "street_address": {
                    "type": "string"
                },
                "city": {
                    "type": "string"
                }
            },
            "required": [
                "street_address"
            ]
        },
        {
            "properties": {
                "street_address": {
                    "type": "string"
                },
                "state": {
                    "type": "string"
                }
            },
            "required": [
                "street_address"
            ]
        }
    ]
}

You'll notice, it's a bit repetitive. Since, in your example, you only provide a "type" for each property, the repetition is not so bad. But if you have more complex properties, you could consider using deifinitions to define each property only once, at the top and then using $ref to reference the definition. Here's a good article on that.




回答3:


Here is a schema that satisfies all four conditions:

    {
        "type": "object",
        "properties": {
            "street_address": {
                "type": "string"
            },
            "city": {
                "type": "string"
            },
            "state": {
                "type": "string"
            }
        },
        "required": [
            "street_address"
        ],
        "anyOf": [{}, {
            "required": ["city"]
        }, {
            "required": ["state"]
        }],
        "not": {
            "required": ["city", "state"]
        },
        "additionalProperties": false
    }


来源:https://stackoverflow.com/questions/27048252/how-to-define-choice-element-in-json-schema-when-elements-are-optional

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!