1

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)
RK Vats
  • 21
  • 3

0 Answers0