Проверка Python jsonschema завершается неудачно, если для AdditionalProperties задано значение false - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь определить схему внутри скрипта Python, которая будет использоваться сразу же для проверки некоторых данных JSON.определение схемы выглядит следующим образом:

    response_schema = {
    "required": ["identifiers" ],
    "properties": {
        "identifiers": {
          "minProperties": 1,"maxProperties": 1,
          "additionalProperties": {
            "required": [  "name","surname" ],
            "properties": {
              "surname": {
                  "required": ["sur1", "sur2" ],
                  "properties": {
                     "sur1": { },
                     "sur2": { }
              } },
              "name": {},

            "additionalProperties": false
            }
          }
        }
      },
    "additionalProperties": false
}

Эта схема прекрасно работает в любом онлайн-валидаторе, но когда я выполняю проверку в моем скрипте:

validate(response_body_dict, response_schema)

Я получаю следующую ошибку:

NameError: имя 'false' не определено

Если я удаляю строки "additionalProperties" : false из схемы, я не получаюошибка, но, конечно, это не работает для меня, поскольку это гораздо менее строгая проверка.

Может кто-нибудь объяснить, почему я получаю эту ошибку?

1 Ответ

0 голосов
/ 02 августа 2019

Проблема заключается в разнице между Python и JSON.В Python вы пишете «False», а в JSON - «false».

Если вы скопируете свою схему в текстовый файл и загрузите ее с помощью модуля json, она будет работать правильно - без ошибок.

Когда вы загружаете этот фрагмент кода в программу Python, вы получаете ошибку, которую вы предоставили, потому что Python не знает, что такое «ложь».Код создает словарь, а не схему JSON.

Если вы хотите создать прототип на месте, вы можете заключить его в "" "и затем использовать json.loads.

Например:

import json
response_schema_str = """{
    "required": ["identifiers" ],
    "properties": {
        "identifiers": {
            "minProperties": 1,
            "maxProperties": 1,
            "additionalProperties": {
                "required": [
                    "name",
                    "surname" ],
                "properties": {
                    "surname": {
                        "required": [
                            "sur1",
                            "sur2" ],
                        "properties": {
                            "sur1": { },
                            "sur2": { }
                        }
                    },
                    "name": {},
                    "additionalProperties": false
                }
            }
        }
    },
    "additionalProperties": false
}"""
response_schema = json.loads(response_schema_str)
print(response_schema)
...