jsonschema проверяет два разных ответа json - PullRequest
0 голосов
/ 26 марта 2019

У меня есть два разных ответа JSON, каждый с разными именами полей, однако оба успешно проходят проверку с определенной схемой с использованием библиотеки jsonschema.

Вот определенная схема

query_schema = {
    "type": "object",
    "properties" : {
        "pltfrm_nm": {"type" : "string"},
        "srvr_nm": {"type": "string"},
        "db_nm": {"type": "string"},
        "tbl_nm": {"type": "string"},
        "ip_addr_id": {"type": "string"},
        "usr_id": {"type": "string"},
        "sql_txt": {"type": "string"},
        "timestmp": {"type": "string"},
    },
}

и вот два разных ответа:

input = {'pltfrm_nm': 'p1', 'srvr_nm': 'server', 'db_nm': 'some db', 'tbl_nm': 'some table',
         'ip_addr_id': '999.999.9999', 'usr_id': 'my id', 'sql_txt': "sql text here", 'timestmp': 'aaaa)'}
validate(instance=input, schema=query_schema)

input = {'why': 'p1', 'does': 'server', 'this': 'some db', 'still': 'some table',
         'validate': '999.999.9999', 'i': 'my id', 'do': "sql text here", 'not': 'aaaa',
         'understand': 'hello'}
validate(instance=input, schema=query_schema)

во втором входе я назвал все поля разными и также добавил новое поле understand. Ни один из них не генерирует ошибку ValidationError. Вот библиотека: https://pypi.org/project/jsonschema/. Почему второй не выдает ошибку?

Ответы [ 2 ]

1 голос
/ 26 марта 2019

Документация гласит:

По умолчанию предоставление дополнительных свойств действительно:

Ключевое слово AdditionalProperties используется для управления обработкой дополнительные вещи, то есть свойства, имена которых не указаны в ключевое слово свойств. По умолчанию разрешены любые дополнительные свойства.

Ключевое слово AdditionalProperties может быть логическим или объектом. Если AdditionalProperties является логическим значением и имеет значение false, дополнительные свойства будут разрешены.

Повторное использование приведенного выше примера, но на этот раз установка дополнительных свойств ложно.

Так что попробуйте добавить это к вашему query_schema:

query_schema = {
    "type": "object",
    "properties" : {
        "pltfrm_nm": {"type" : "string"},
        "srvr_nm": {"type": "string"},
        "db_nm": {"type": "string"},
        "tbl_nm": {"type": "string"},
        "ip_addr_id": {"type": "string"},
        "usr_id": {"type": "string"},
        "sql_txt": {"type": "string"},
        "timestmp": {"type": "string"},
    },
  "additionalProperties": False
}
0 голосов
/ 26 марта 2019

Схема JSON основана на ограничениях, а не на разрешениях. Пустая схема JSON {} означает, что все допустимо.

Давайте посмотрим, какое ограничение добавляет ключевое слово properties ...

Проверка успешна, если для каждого имени, которое появляется как в
экземпляр и как имя в значении этого ключевого слова, дочерний элемент
экземпляр для этого имени успешно проверяется по
соответствующая схема.

Пропуск этого ключевого слова ведет себя так же, как пустой объект.

https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-6.5.4

Это означает, что схема значения ключа в объекте properties применима к соответствующему значению в экземпляре JSON.

Принимая ваш пример:

...    
    "properties" : {
            "pltfrm_nm": {"type" : "string"}
    }
...

pltfrm_nm должна быть строкой.

Это единственное ограничение, которое подразумевает приведенный выше фрагмент кода.

Ожидаете ли вы, что ключи, не указанные в proprties, вызовут ошибку проверки? Если это так, вам нужно указать этот факт.

Чтобы не указывать никаких дополнительных свойств, кроме тех, которые определены в properties, необходимо использовать additionalProperties

https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-6.5.6

Я бы порекомендовал вам ознакомиться с нашим учебным ресурсом по http://json -schema.org / понимание-json-схема / и http://json -schema.org / понимание- json-schema / для введения в схему JSON.

...