anfisc
anfisc

Reputation: 48

How can I specify in a json schema that a certain property is mandatory and also must contain a specific value?

I want to create several json schemas for different scenarios.

For scenario 1 I would like to specify that:

a) The property "draftenabled" must have the value true.

b) the property "draftenabled" does exist.

I have checked this post Validating Mandatory String values in JSON Schema and tried the following

I tried to validate this json

{
    "$schema": "./test-schema.json",
    "draftenabled": false,
    "prefix": "hugo"
}

with this schema test-schema.json that I had created in Visual Studio Code.

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "properties": {
        "$schema": {
            "type": "string"
        },
        "draftenabled": {
            "type": "boolean"
        },
        "prefix": {
            "type": "string"
        }
    },
    "additionalItems": false,
    "contains": {
        "properties": {
            "draftenabled": {
                "const": true
            }
        },
        "required": [
            "draftenabled"
        ]
    }
}

I would have expected an error since the value for draftenabled is false rather than true.

Upvotes: 0

Views: 1321

Answers (1)

gregsdennis
gregsdennis

Reputation: 8428

It looks like there is some confusion around how the keywords apply to instances (data) of different types.

  • properties only applies to objects
  • additionalItems and contains only apply to arrays

Since your instance is an object, additionalItems and contains will be ignored.

Based on your description of what you want, I would do something like the following:

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "properties": {
        "$schema": {
            "type": "string"
        },
        "draftenabled": {
            "const": "true"
        },
        "prefix": {
            "type": "string"
        }
    },
    "required": [
        "draftenabled"
    ]
}

This moves the definitions you have in the contains into the main schema. You got that bit right, just in the wrong place.


You also mention that this is a "scenario 1." If there are other scenarios, I suggest creating schemas like this for each scenario then wrapping all of them together in a oneOf or anyOf:

{
    "oneOf": [
        { <scenario 1> },
        { <scenario 2> },
        ...
    ]
}

Upvotes: 2

Related Questions