2014-11-17 2 views
0

Я использую Tornado_JSON, который основан на jsonschema, и есть проблема с моим определением схемы. Я попытался установить его в онлайн-валидаторе схемы, и проблема, похоже, лежит в "additionalItems": True. True с капиталом T работает на python и приводит к ошибке в онлайн-валидаторе (Schema is invalid JSON.). С помощью true онлайн-валидатор счастлив, и пример json проверяется на соответствие схеме, но мой скрипт python больше не запускается (NameError: name 'true' is not defined). Можно ли это как-то решить?JSON Schema: Input malformed

@schema.validate(
     """input_schema={ 
      'type': 'object', 
      'properties': { 
         'DB': { 
          'type': 'number' 
         }, 
         'values': { 
          'type': 'array', 
          'items': [ 
           { 
            'type': 'array', 
            'items': [ 
             { 
              'type': 'string' 
             }, 
             { 
              'type': [ 
               'number', 
               'string', 
               'boolean', 
               'null' 
              ] 
             } 
            ] 
           } 
          ], 
          'additionalItems': true 
         } 
      } 
     }, 
     input_example={ 
      'DB': 22, 
      'values': [['INT', 44],['REAL', 33.33],['CHAR', 'b']] 
     }""" 
) 

Я изменил его в соответствии с вашими комментариями (внешний файл с json.loads()). Отлично. Спасибо.

ответ

1

Поместите схему в тройном кавычках или внешний файл, затем проанализируйте его с помощью json.loads(). Используйте строчную орфографию.

0

Ошибка связана с попыткой поместить встроенный тип данных Python в схему JSON. Последний является синтаксисом шаблона, который используется для проверки согласованности типов и не должен содержать фактические данные. Вместо этого, под input_schema вы хотите определить "additionalItems", чтобы быть { "type": "boolean" }, а затем добавить его в тестовый JSON в свой input_example с булевым после тестирования.

Кроме того, я не слишком хорошо знаком с Tornado_JSON, но похоже, что вы не соблюдаете язык определения схемы, разместив "additionalItems" внутри свойства "values". Поднимите это на один уровень.

Более конкретно, я думаю, что вы пытаетесь сделать, должно выглядеть следующим образом:

"values": { 
    ...value schema definition... 
} 
"additionalItems": { 
    "type": "boolean" 
} 

И примеры ввода станут:

input_example={ 
    "DB": 22, 
    "values": [['INT', 44],['REAL', 33.33],['CHAR', 'b']], 
    "additionalItems": true 
} 
+0

Спасибо, bjornsen. Это означало как атрибут схемы для предоставления более чем одного элемента, как описано [здесь] (https://github.com/json-schema/json-schema/wiki/additionalItems-and-items). – toas939

+1

А вот в этом случае проблема заключается в том, что Python пытается создать словарь из {...} после 'input_schema'. Он должен работать, если вы в тройном ключе указываете на определение всей схемы с строчным «истинным». – bjornsen