Нет ошибки enum при проверке JSON с использованием jsonschema в python - PullRequest
0 голосов
/ 31 августа 2018

Во-первых, я не получаю правильного ответа об ошибках и на веб-платформе (https://jsonschemalint.com). Я использую jsonschema в python и имею правильную схему json и данные json, которые работают.

Проблема, которую я хотел бы решить, заключается в следующем: прежде чем мы доставим файлы JSON с примерами данных, нам нужно запустить их через SoapUI, чтобы проверить их правильность, поскольку мы имеем дело с огромными файлами, и обычно наши разработчики могут допустим некоторые ошибки при их генерации, поэтому мы делаем последнюю проверку.

Я бы хотел создать скрипт для автоматизации этого, избегая SoapUI. Поэтому после поиска в Google я наткнулся на jsonschema и попытался использовать его. Я получаю все правильные результаты и т. Д., Я получаю ошибки, когда удаляю определенные элементы как обычно, но самые большие проблемы заключаются в следующем:

Пример: У меня есть объект sububsub в моей схеме JSON, назовем его Test1, который содержит следующее:

**Schema**
    {
   "exname":"2",
   "info":{},
   "consumes":{},
   "produces":{},
   "schemes":{},
   "tags":{},
   "parameters":{},
   "paths":{},
   "definitions":{
      "MainTest1":{
         "description":"",
         "minProperties":1,
         "properties":{
            "test1":{
               "items":{
                  "$ref":"#//Test1"
               },
               "maxItems":10,
               "minItems":1,
               "type":"array"
            },
            "test2":{
               "items":{
                  "$ref":"#//"
               },
               "maxItems":10,
               "minItems":1,
               "type":"array"
            }
         }
      },
      "Test1":{
         "description":"test1des",
         "minProperties":1,
         "properties":{
            "prop1":{
               "description":"prop1des",
               "example":"prop1exam",
               "maxLength":10,
               "minLength":2,
               "type":"string"
            },
            "prop2":{
               "description":"prop2des",
               "example":"prop2example",
               "maxLength":200,
               "minLength":2,
               "type":"string"
            },
            "prop3":{
               "enum":[
                  "enum1",
                  "enum2",
                  "enum3"
               ],
               "example":"enum1",
               "type":"string"
            }
         },
         "required":[
            "prop3"
         ],
         "type":"object"
      }
   }
}

    **Proper example for Test1** 
    {
    "Test1": [{
        "prop1": "TestStr",
        "prop2": "Test and Test",
        "prop3": "enum1"
    }]
    }

    **Improper example that still passes validation for Test1** 
    {
    "test1": [{
        "prop1": "TestStr123456", [wrong as it passes the max limit]
        "prop2": "Test and Test",
        "prop3": " enum1" [wrong as it has a whitespace char before enum1]
    }]
    }

Первая проблема, с которой я столкнулся, заключается в том, что enum в prop3 не проверен правильно. Итак, когда я использую «enum1» или «enumruwehrqweur» или «буквально что-нибудь», тесты проходят. Кроме того, символы min-max не проверяются в моем JSON. Независимо от того, сколько символов я использую в любом поле, я не получаю сообщение об ошибке. У кого-нибудь есть идеи, как это исправить, или кто-нибудь нашел лучший способ сделать то, что я хотел бы сделать? Заранее спасибо!

1 Ответ

0 голосов
/ 31 августа 2018

Было несколько проблем с вашей схемой. Я обращусь к каждому из них.

В вашей схеме у вас есть "Test1". В вашем экземпляре JSON у вас есть «test1». Дело важно. Я думаю, это просто ошибка при создании вашего примера.

В вашей схеме у вас есть "Test1" на корневом уровне. Поскольку это не ключевое слово схемы, оно игнорируется и не влияет на проверку. Вам нужно вложить его в объект «свойств», как вы это делали в другом месте.

{
  "properties": {
    "test1": {

Ваша проверка все равно не будет работать правильно. Если вы хотите проверить каждый элемент в массиве, вам нужно использовать ключевое слово items.

{
  "properties": {
    "test1": {
      "items": {
        "description": "test1des",

Наконец, вам нужно вложить ключевые слова required и type в объект items.

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

{
  "properties": {
    "test1": {
      "items": {
        "description": "test1des",
        "minProperties": 1,
        "properties": {
          "prop1": {
            "description": "prop1des",
            "example": "prop1exam",
            "maxLength": 10,
            "minLength": 2,
            "type": "string"
          },
          "prop2": {
            "description": "prop2des",
            "example": "prop2example",
            "maxLength": 200,
            "minLength": 2,
            "type": "string"
          },
          "prop3": {
            "enum": [
              "enum1",
              "enum2",
              "enum3"
            ],
            "example": "enum1",
            "type": "string"
          }
        },
        "required": [
          "prop3"
        ],
        "type": "object"
      }
    }
  }
}
...