2013-07-16 63 views
0

我正在使用JSON模式,我试图使用python JSON模块来验证我对模式输出的一些JSON。架构没有验证

我碰到下面的错误,说明该模式本身不验证:

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后必须跟随4个十六进制数字,并且应该位于字符串周围的双引号内,在\转义字符之后。
+0

你有什么建议如何解决你提出的第二点? – goldisfine

+0

如果每个名称字段的值只是字符串,就像它们出现的那样,那么您可能只需要删除“u”字符。这些角色在这些情况下的意图是什么? –

+0

没有意图。当我运行脚本时,角色就会出现。请参阅问题中的修改。 – goldisfine

3

这不是什么ValidationError表示。它表明验证失败:),而不是JSON无效(jsonschema甚至没有处理JSON,它处理反序列化的JSON,即Python对象,这里是一个字典)。如果JSON无效,当您拨打json.load时会发生错误。

它失败的原因是因为实际上它不是一个对象,它是一个具有单个元素和对象的元组,因此它实际上是无效的。为什么它是一个元组是你的代码中的一个错误(你在我看到的末尾有一个流浪的逗号)。 (和FYI,u前缀是因为那些是Unicode字符,并且单引号是因为这是reprstr,与JSON无关)。

+0

好吧,所以:1.不需要担心单引号和Unicode字符,2.我需要弄清楚如何在最后删除逗号,以便它不再认为obj是一个元组? – goldisfine

+0

您需要删除逗号,否则'gc_ieca' *是*元组,是的。不知道要弄清楚什么,只需删除该字符:)。 – Julian

+0

那么问题是,我想输出许多这些对象,如果逗号是自动添加并导致错误,那么我需要找到输出JSON对象的代码中的哪个位置,我添加一个逗号一个错误。 – goldisfine