jl118
jl118

Reputation: 331

JSON schema definition with multiple sets of enums for array attribute

I want to create a JSON schema for an object in which one of the attributes is restricted to multiple sets of enums.

For example:

{
  "data": {
    "type": "myObject",
    "attributes": {
      "states": [
        "Washington",
        "Oregon",
        "California"
      ]
    }
  }
}

is a valid JSON object against the schema. And

{
  "data": {
    "type": "myObject",
    "attributes": {
      "states": [
        "British Columbia",
        "Alberta",
        "Ontario"
      ]
    }
  }
}

is also a valid JSON object agains the schema

BUT,

{
  "data": {
    "type": "myObject",
    "attributes": {
      "states": [
        "Washington",
        "Oregon",
        "Alberta"
      ]
    }
  }
}

is NOT a valid JSON object against the schema.

I have tried the following schema definition:

{
  "type": "object",
  "properties": {
    "data": {
      "type": "object",
      "properties": {
        "type": {
          "type": "string"
        },
        "attributes": {
          "type": "object",
          "properties": {
            "states": {
              "type": "array",
              "items": {
                "oneOf": [
                  {
                    "enum": ["Washington","Oregon","California"],
                    "description": "United States"
                  },
                  {
                    "enum": ["British Columbia","Alberta", "Ontario"],
                    "description": "Canada"
                  }
                ]
              },
              "description": "Filter by states"
            }
          }
        }
      }
    }
  }
}

But with this schema above this is still considered valid:

{
  "data": {
    "type": "myObject",
    "attributes": {
      "states": [
        "Washington",
        "Oregon",
        "Alberta"
      ]
    }
  }
}

BTW, you can use this for testing whether a JSON object conforms to a schema: https://www.jsonschemavalidator.net/

Thank you!

Upvotes: 0

Views: 555

Answers (1)

Ether
Ether

Reputation: 53986

You need to invert the order of the oneOf and the items keywords, so that the same oneOf clause is used for all items:

...
            "states": {
              "type": "array",
              "oneOf": [
                {
                  "items": {
                    "enum": ["Washington","Oregon","California"],
                    "description": "United States"
                  }
                },
                {
                  "items": {
                    "enum": ["British Columbia","Alberta", "Ontario"],
                    "description": "Canada"
                  }
                }
              ]
            },
...

Upvotes: 2

Related Questions