Here am trying to validate my JSON schema using jsonschema(Draft7Validator) library
Validating Schema:
{
"oneOf": [
{
"required": [
"Packet"
],
"properties": {
"Packet": {
"type": "object",
"required": [
"ShippingSerialID"
],
"properties": {
"ShippingSerialID": {
"type": "string",
"minLength": 1,
"maxLength": 2
}
}
}
}
},
{
"required": [
"Packet_2"
],
"properties": {
"Packet_2": {
"type": "object",
"required": [
"ShippingSerialID",
"Address"
],
"properties": {
"ShippingSerialID": {
"type": "string",
"minLength": 1,
"maxLength": 2
},
"Address": {
"type": "string",
"maxLength": 255
}
}
}
}
}
]
}
against JSON data:
{ 'name': 'William Shakespeare', 'address': 'Henley Street, England', 'Packet': {'ShippingSerialID': 'xyz'} }
through back errors:
[
{
'path': 'Packet.ShippingSerialID',
'message': "'xyz' is too long",
'validator': 'maxLength',
'validatorValue': 2
},
{
'path': '',
'message': "'Packet_2' is a required property",
'validator': 'required',
'validatorValue': [
'Packet_2'
]
}
]
here for the first oneOf it generate deepdive error "Packet.ShippingSerialID" -> "'xyz' is too long", but for second od oneOf it generate error for root element "'Packet_2' is a required property" only. What am expecting from it is:
[
{
'path': 'Packet.ShippingSerialID',
'message': "'xyz' is too long",
'validator': 'maxLength',
'validatorValue': 2
},
{
'path': '',
'message': "'Packet_2' is a required property",
'validator': 'required',
'validatorValue': [
'Packet_2'
]
},
{
'path': 'Packet_2.Address',
'message': "'Address' is a required property",
'validator': 'required',
'validatorValue': [
'Address',
'ShippingSerialID'
]
},
{
'path': 'Packet_2.ShippingSerialID',
'message': "'xyz' is too long",
'validator': 'maxLength',
'validatorValue': 2
]
How can I achieve above result.
The Python code am using for this look like:
from jsonschema.validators import Draft7Validator
from jsonschema import draft7_format_checker
v = Draft7Validator(schema, format_checker=draft7_format_checker)
errors = sorted(v.iter_errors(json_data), key=lambda e: e.path)
errors_data = []
for error in errors:
for sub_error in sorted(error.context, key=lambda e: e.schema_path):
error_dict = {"path": ".".join(str(path) for path in sub_error.path)}
error_dict["message"] = sub_error.message
error_dict["validator"] = sub_error.validator
error_dict["validatorValue"] = sub_error.validator_value
errors_data.append(error_dict)
print(errors_data)