Question

Is it possible to make jsonschema to have only one of two fields.

For example, image if I want to have a JSON with ether start_dt or end_dt but not both of them at the same time. like this:

OK

{
    "name": "foo",
    "start_dt": "2012-10-10"
} 

OK

{
    "name": "foo",
    "end_dt": "2012-10-10"
} 

NOT OK

{
    "name": "foo",
    "start_dt": "2012-10-10"
    "end_dt": "2013-11-11"
} 

What should I add to the schema:

{ 
    "title": "Request Schema",
    "type": "object",
    "properties": {
        "name": 
            {   
                "type": "string"
            },  
        "start_dt": 
            {
                "type": "string",
                "format": "date"

            },
        "end_dt":
            {
                "type": "string",
                "format": "date"
            }
    }
}
Was it helpful?

Solution

You can express this using oneOf. This means that the data must match exactly one of the supplied sub-schemas, but not more than one.

Combining this with required, this schema says that instances must either define start_dt, OR define end_dt - but if they contain both, then it is invalid:

{
    "type": "object",
    "properties": {
        "name": {"type": "string"},
        "start_dt": {"type": "string", "format": "date"},
        "end_dt": {"type": "string", "format": "date"}
    },
    "oneOf": [
        {"required": ["start_dt"]},
        {"required": ["end_dt"]}
    ]
}

Online demos with your three examples:

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top