Closed

Description
Consider:
import jsonschema
schema = {
"type": "object",
"properties": {
"cat": {
"type": "string"
},
"dog": {
"type": "string"
}
},
"required": ["cat","dog"]
}
data = {
"cat": "socks"
}
validator = jsonschema.Draft7Validator(schema)
for e in validator.iter_errors(data):
print("ERROR")
for k,v in e.__dict__.items():
print(k + " = " + str(v))
The output is:
ERROR
message = 'dog' is a required property
path = deque([])
relative_path = deque([])
schema_path = deque(['required'])
relative_schema_path = deque(['required'])
context = []
cause = None
validator = required
validator_value = ['cat', 'dog']
instance = {'cat': 'socks'}
schema = {'type': 'object', 'properties': {'cat': {'type': 'string'}, 'dog': {'type': 'string'}}, 'required': ['cat', 'dog']}
parent = None
_type_checker = <TypeChecker types={'array', 'boolean', 'integer', 'null', 'number', 'object', 'string'}>
In this case, only the "dog" field is missing but there is no field on the error that tells me that without taking apart the message (which I don't want to do as the message is more likely to change that a separate field).
validator_value lists both fields so that isn't useful.
Comparing the validator_value items to keys in instance may work, but that gets complex if there are 3 or more required fields:
import jsonschema
schema = {
"type": "object",
"properties": {
"cat": {
"type": "string"
},
"dog": {
"type": "string"
},
"ferret": {
"type": "string"
}
},
"required": ["cat","dog", "ferret"]
}
data = {
"cat": "socks"
}
validator = jsonschema.Draft7Validator(schema)
for e in validator.iter_errors(data):
print("ERROR")
for k,v in e.__dict__.items():
print(k + " = " + str(v))
Gives:
ERROR
message = 'dog' is a required property
path = deque([])
relative_path = deque([])
schema_path = deque(['required'])
relative_schema_path = deque(['required'])
context = []
cause = None
validator = required
validator_value = ['cat', 'dog', 'ferret']
instance = {'cat': 'socks'}
schema = {'type': 'object', 'properties': {'cat': {'type': 'string'}, 'dog': {'type': 'string'}, 'ferret': {'type': 'string'}}, 'required': ['cat', 'dog', 'ferret']}
parent = None
_type_checker = <TypeChecker types={'array', 'boolean', 'integer', 'null', 'number', 'object', 'string'}>
ERROR
message = 'ferret' is a required property
path = deque([])
relative_path = deque([])
schema_path = deque(['required'])
relative_schema_path = deque(['required'])
context = []
cause = None
validator = required
validator_value = ['cat', 'dog', 'ferret']
instance = {'cat': 'socks'}
schema = {'type': 'object', 'properties': {'cat': {'type': 'string'}, 'dog': {'type': 'string'}, 'ferret': {'type': 'string'}}, 'required': ['cat', 'dog', 'ferret']}
parent = None
_type_checker = <TypeChecker types={'array', 'boolean', 'integer', 'null', 'number', 'object', 'string'}>
Could we have a new field added to this error to just state what is missing? (in the first example - "dog")
Happy to have a go if you think this is a good idea.
Thank you!
Metadata
Metadata
Assignees
Labels
No labels