Почему JSON-проверка всегда успешна с использованием этой схемы, содержащей 'allOf'? - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть схема JSON, с помощью которой я хочу проверить некоторые данные, используя python и модуль jsonschema.Тем не менее, это не совсем работает, как ожидалось, так как некоторые из принятых данных вообще не действительны (для меня и цели моего приложения).К сожалению, схема предоставлена, поэтому я не могу изменить саму схему - по крайней мере, не вручную.

Это сокращенная версия схемы ('schema.json' в приведенном ниже коде):

{
  "type": "object",
  "allOf": [
    {
      "type": "object",
      "allOf": [
        {
          "type": "object",
          "properties": {
            "firstName": {
              "type": "string"
            },
            "lastName": {
              "type": "string"
            }
          }
        },
        {
          "type": "object",
          "properties": {
            "language": {
              "type": "integer"
            }
          }
        }
      ]
    },
    {
      "type": "object",
      "properties": {
        "addressArray": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "streetNumber": {
                "type": "string"
              },
              "street": {
                "type": "string"
              },
              "city": {
                "type": "string"
              }
            }
          }
        }
      }
    }
  ]
}

Это пример того, что должно быть допустимым экземпляром ('person.json' в приведенном ниже коде):

{
  "firstName": "Sherlock",
  "lastName": "Holmes",
  "language": 1,
  "addresses": [
    {
      "streetNumber": "221B",
      "street": "Baker Street",
      "city": "London"
    }
  ]
}

Это пример того, что следует считать недействительным ('no_person.json 'в коде ниже):

{
  "name": "eggs",
  "colour": "white"
}

И этот код я использовал для проверки:

from json import load
from jsonschema import Draft7Validator, exceptions

with open('schema.json') as f:
    schema = load(f)
with open('person.json') as f:
    person = load(f)
with open('no_person.json') as f:
    no_person = load(f)

validator = Draft7Validator(schema)
try:
    validator.validate(person)
    print("person.json is valid")
except exceptions.ValidationError:
    print("person.json is invalid")
try:
    validator.validate(no_person)
    print("no_person.json is valid")
except exceptions.ValidationError:
    print("no_person.json is invalid")

Результат:
person.json is valid
no_person.json is valid

Я ожидал, что no_person.json будет недействительным.Что можно сделать, чтобы только такие данные, как person.json, были успешно проверены?Большое спасибо за вашу помощь, я очень новичок в этом (потратил целую вечность в поисках ответа).

...