Specify a value can be a string or null with JSON Schema

Jsonjson.netJsonschema

Json Problem Overview


Hopefully this isn't obvious to others because I find the docs at https://json-schema.org/ to be lacking in finer details. I'm getting a block of JSON with some properties that can be null or a string. How do you specify, in a JSON Schema (to be parsed by Json.NET's JsonSchema.Parse method), that a value can be of type null or type string?

Is there something simple I'm missing like supplying an array for the type? For example;

"member_region": { "type": [ "string", null ] } // this throws an exception

Also, does anyone have a better source for JSON Schema details than json-schema.org? Where can I find a larger selection of examples? I don't want to read a big document/specification to find something that can easily be demonstrated in a 10 line example.

Json Solutions


Solution 1 - Json

From https://json-schema.org/understanding-json-schema/reference/type.html

> The type keyword may either be a string or an array: > * If it’s a string, it is the name of one of the basic types above. > * If it is an array, it must be an array of strings, where each string is the name of one of the basic types, and each element is unique. In this case, the JSON snippet is valid if it matches any of the given types

The same page lists also the defined data type names, including string and null.

Try:

"member_region": { "type": ["string", "null"] }

Solution 2 - Json

Extending on Explosion Pills answer if you go for the array syntax:

"member_region": { "type": [ "string", "null" ] } // this works

because you are stating a type, not an example/value. You shouldn't go for:

 "member_region": { "type": [ "string", null ] } // this throws an exception

Solution 3 - Json

["string", "null"] will work if you're not using a RegEx pattern.

I'm using a date field validator:

    (0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\\d\\d 

to allow a MM/dd/yyyy pattern, but it will throw a non-match error at an empty string ("")

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionevanmcdonnalView Question on Stackoverflow
Solution 1 - JsonExplosion PillsView Answer on Stackoverflow
Solution 2 - JsonzardiliorView Answer on Stackoverflow
Solution 3 - JsonTheWizardOfTNView Answer on Stackoverflow