FewKey
FewKey

Reputation: 191

Apply addtional constraints to a refered definition in JSON schema

I defined in the schema a validType, where every attribute should have text and annotation .

I want to add additional constraints to refine the text of course must follow "pattern":"[a-z]{2}[0-9]{2}". Is there any way I can apply the constraint directly without copy&paste the content of the validType?

Schema:

{
    "type": "object",
    "definition": {
        "validType": {
            "description": "a self-defined type, can be complicated",
            "type": "object",
            "properties": {
                "text": {
                    "type": "string"
                },
                "annotation": {
                    "type": "string"
                }
            }
        },
        "properties": {
            "name": {
                "$ref": "#/definitions/validType"
            },
            "course": {
                "$ref": "#/definitions/validType"
            }
        }
    }
}

Data:

{"name":{
    "text":"example1",
    "annotation":"example1Notes"},
 "course":{
    "text":"example2",
    "annotation":"example2Notes"}}

The expected schema for course should work as this:

{"course": {
      "type": "object",
            "properties": {
                "text": {
                    "type": "string",
                    "pattern":"[a-z]{2}[0-9]{2}"

                },
                "annotation": {
                    "type": "string"
                }
            }
        }}

But instead of repeating the big block of validType, I am expecting something similar to the format below:

{"course": {
                "$ref": "#/definitions/validType"
                "text":{"pattern":"[a-z][0-9]"}
}}

Upvotes: 1

Views: 556

Answers (1)

Relequestual
Relequestual

Reputation: 12315

Yup! You can add constraints but you cannot modify the constraints you reference.

To add constraints, you need to understand that $ref for draft-07 and previous is the only allowed key in a subschema when it exsits. Other keys are ignored if it exists.

As such, you need to create two subschemas, one of which has your reference, and the other your additional constraint. You then wrap these two subschemas in an allOf.

Here's how that would look...

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "course": {
      "allOf": [
        {
          "$ref": "#/definitions/validType"
        },
        {
          "properties": {
            "text": {
              "pattern": "[a-z][0-9]"
            }
          }
        }
      ]
    }
  }
}

Have a play using https://jsonschema.dev

Upvotes: 1

Related Questions