Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JSON Schema - specify field is required based on value of another field

Wondering if this is possible with schema draft 03. I've gotten dependencies working elsewhere, I think there is possibly just some creative use of them required in order to use them for specifying the required property of some field.

My current best attempt (which doesn't work) should give you some idea of what I'm after. I want a value required by default, and optional when another field has a particular value.

{     "description"   : "An address...",     "type" : "object",     "properties" : {         "postcode": {             "type" : "string",             // postcode should be required by default             "required" : true,                   // postcode shouldn't be required if the country is new zealand              "dependencies" : {                 "country" : {                     "enum" : ["NZ", "NZL", "NEW ZEALAND"]                 },                 "postcode" : {                     "required" : false                       }             }         },         "country": {             "type" : "string",             "enum" : [                 // various country codes and names...             ],             "default" : "AUS"         }     } } 
like image 293
pospi Avatar asked Jan 27 '12 05:01

pospi


1 Answers

This is definitely possible with version 3 of the draft. Since you have a complete list of allowed countries, then you could do something like this:

{     "type": [         {             "title": "New Zealand (no postcode)",             "type": "object",             "properties": {                 "country": {"enum": ["NZ", "NZL", "NEW ZEALAND"]}             }         },         {             "title": "Other countries (require postcode)",             "type": "object",             "properties": {                 "country": {"enum": [<all the other countries>]},                 "postcode": {"required": true}             }         }     ],     "properties": {         "country": {             "type" : "string",             "default" : "AUS"         },         "postcode": {             "type" : "string"         }     } } 

So you actually define two sub-types for your schema, one for countries that require a postcode, and one for countries that do not.

EDIT - the v4 equivalent is extremely similar. Simply rename the top-level "type" array to "oneOf".

like image 117
cloudfeet Avatar answered Sep 20 '22 23:09

cloudfeet