2013-07-16 2 views
0

Я работаю с JSON-схемой, и я пытаюсь использовать модуль JSON python для проверки некоторых JSON I, выводимых по схеме.Schema not validating

Я получаю следующее сообщение об ошибке, указывающее, что сама схема не проверки:

validation 
Traceback (most recent call last): 
    File "/private/var/folders/jv/9_sy0bn10mbdft1bk9t14qz40000gn/T/Cleanup At Startup/gc_aicep-395698294.764.py", line 814, in <module> 
    validate(entry,gc_schema) 
    File "/Library/Python/2.7/site-packages/jsonschema/validators.py", line 468, in validate 
    cls(schema, *args, **kwargs).validate(instance) 
    File "/Library/Python/2.7/site-packages/jsonschema/validators.py", line 117, in validate 
    raise error 
jsonschema.exceptions.ValidationError: ({'website': 'www.stepUp.com', 'bio': '', 'accreditations': {'portfolio': '', 'certifications': [], 'degrees': {'degree_name': [], 'major': '', 'institution_name': '', 'graduation_distinction': '', 'institution_website': ''}}, 'description': 'A great counselor', 'photo': '', 'twitter': '', 'additionaltext': '', 'linkedin': '', 'price': {'costtype': [], 'costrange': []}, 'phone': {'phonetype': [], 'value': '1234567891'}, 'facebook': '', 'counselingtype': [], 'logourl': '', 'counselingoptions': [], 'linkurl': '', 'name': {'first_name': u'Rob', 'last_name': u'Er', 'middle_name': u'', 'title': u''}, 'email': {'emailtype': [], 'value': ''}, 'languages': 'english', 'datasource': {'additionaltext': '', 'linkurl': '', 'linktext': '', 'logourl': ''}, 'linktext': '', 'special_needs_offer': '', 'company': 'Step Up', 'location': {'city': 'New York', 'zip': '10011', 'locationtype': '', 'state': 'NY', 'address': '123 Road Dr', 'loc_name': '', 'country': 'united states', 'geo': ['', '']}},) is not of type 'object' 

Сообщение ValidationError указывает на то, что следует двоеточие не является допустимым объектом JSON, я думаю, но я не могу выяснить, почему этого не будет.

Этот JSON проверяет использование валидатора, такого как JSON Lint, если вы заменяете одиночные кавычки двойным и удаляете основные скобки с обеих сторон.

«u» перед именем был помечен как возможная ошибка.

Это код, который выводит имя:

name = HumanName(row['name']) 
first_name = name.first 
middle_name = name.middle 
last_name = name.last 
title = name.title 
full_name = dict(first_name=first_name, middle_name=middle_name, last_name=last_name, title=title)  

имя вставляется в JSON, используя следующие:

gc_ieca = dict( 

name = full_name, 
twitter = twitter, 

logourl = logourl, 
linktext = linktext, 
linkurl = linkurl, 
additionaltext = additionaltext, 
datasource = datasource, 

phone=phone, 
email = email, 

price = price, 
languages = languages, 

special_needs_offer = special_needs_offer, 

# location 
location = location, 

accreditations = accreditations, 

website = website 

), 
+0

Возможно, добавьте код, в который эти поля вставлены в json? –

ответ

2

Я вижу две потенциальные проблемы здесь:

  1. Использование одинарных котировок. Строго говоря, json spec требует использования двойных кавычек для строк. Ваш окончательный вид примечаний подразумевает, что это не ваша проблема, однако стоит упомянуть, как что-то, чтобы проверить, не исправляет ли исправление №2 проблему.
  2. Значения для имени: они указаны как u'...', что недействительно json. Использование u должно сопровождаться четырьмя шестнадцатеричными цифрами и должно попадать в двойные кавычки, окружающие строку, после escape-символа \.
+0

Есть ли у вас какие-либо советы по решению второго вопроса, который вы поднимаете? – goldisfine

+0

Если значения для каждого из полей имени являются строками, по мере их появления, вам может просто понадобиться удалить символ 'u'. Каково намерение этого персонажа в этих случаях? –

+0

Без намерения. Символ появляется только при запуске скрипта. См. Редактирование в вопросе. – goldisfine

3

Это не то, что указывает ValidationError. Это указывает на то, что валидация не удалась :), а не что JSON недействителен (jsonschema даже не имеет отношения к JSON, он имеет дело с десериализованными объектами JSON i.e, здесь dict). Если JSON недействителен, вы получите сообщение об ошибке при вызове json.load.

Причина, по которой это происходит, состоит в том, что на самом деле это не объект, это кортеж с одним элементом, объектом, поэтому он фактически недействителен. Почему это кортеж - это ошибка в вашем коде (у вас есть паразитная запятая в конце, которую я вижу).

(И FYI, в u префиксы, потому что те Юникода литералов, и одиночные кавычки, потому что это repr из str, ничего общего с JSON).

+0

Хорошо, так: 1. Не нужно беспокоиться о одиночных кавычках и литералах в формате Юникод, 2. Мне нужно выяснить, как удалить запятую в конце, чтобы она перестала думать, что obj является кортежем? – goldisfine

+0

Вам нужно удалить запятую, иначе 'gc_ieca' * есть * кортеж, да. Не уверен, что нужно выяснить, просто удалите персонажа :). – Julian

+0

Ну, проблема в том, что я пытаюсь вывести многие из этих объектов, и если запятая автоматически добавлена ​​и вызывает ошибку, тогда мне нужно будет найти, где в коде, который выводит объекты JSON, я добавляю запятую, которая срабатывает ошибка. – goldisfine