Validate jsonschema date format

34 Views Asked by At

I'm trying to validate the date property of a json object in python.

# Define JSON object
json_object = {
    "date": "21ducn23-dsfsd-ds",
    "age": 30
}

# Define JSON schema with date format
json_schema = {
    "type": "object",
    "properties": {
        "date": {"type": "string", "format": "date"},
        "age": {"type": "integer"},
    },
    "required": ["date", "age"],
    }
} 

# Validate JSON object against schema
jsonschema.validate(instance=json_object, schema=json_schema)

But as long as the date field is a string the validation comes through successfully.

I have read several answers to similar questions suggesting that format is annotation only. It seems that the documentation suggests otherwise but I may be missing something.

What can I do to get this to work without defining a regex expression for the date property?

I'm using jsonschema==4.21.1 and jsonschema-specifications==2023.12.1

1

There are 1 best solutions below

0
e-motta On BEST ANSWER

From the documentation you linked:

By default, format is just an annotation and does not effect validation. Optionally, validator implementations can provide a configuration option to enable format to function as an assertion rather than just an annotation.

To do that in Python using jsonschema, you need to hook a format-checking object into the Validator.

So just add format_checker=jsonschema.FormatChecker() to your validate call:

from jsonschema import FormatChecker

jsonschema.validate(
    instance=json_object, schema=json_schema, format_checker=FormatChecker()
)

It will then raise an error:

jsonschema.exceptions.ValidationError: '21ducn23-dsfsd-ds' is not a 'date'

Failed validating 'format' in schema['properties']['date']:
    {'format': 'date', 'type': 'string'}

On instance['date']:
    '21ducn23-dsfsd-ds'