我从Facebook Graph Explorer API中提取一些信息。 API的输出是JSON对象
有时输出包含我正在寻找的字段(即教育,学校名称等),有时它不包含。为了弥补这一点,我必须为我正在寻找的每个json字段写一个try/except/else
块:
# gender
try:
gender=json_dict['gender']
if gender=='male':
gender= unicode('M')
elif gender=='female':
gender=unicode('F')
except:
pass
#birthday
try:
birthday=json_dict['birthday']
if len(birthday)==10:
birthday=int(birthday[6:])
else:
birthday=unicode('NULL')
except:
pass
#hometown id
try:
hometown_id=int(json_dict['hometown']['id'])
except:
pass
然后继续。这种方法有效,但它似乎有点......笨拙?它适用于我的目的,因为我只是在寻找六个字段左右。是否有更好/更聪明的方法来扩展这个过程?
答案 0 :(得分:0)
使用dict.get(key)
或dict.get(key, defaultValue)
。
try:
gender=json_dict['gender']
if gender=='male':
gender= unicode('M')
elif gender=='female':
gender=unicode('F')
except:
pass
会转换为
gender=json_dict.get('gender')
if gender=='male':
gender= unicode('M')
elif gender=='female':
gender=unicode('F')
else:
gender = None # is the default case. no need to write that.
或
gender={'male':u'M', 'female':u'F'}.get(json_dict.get('gender'))
或者,您可以使用in
进行测试:
if 'gender' in json_dict:
gender=json_dict['gender']
if gender=='male':
gender= unicode('M')
elif gender=='female':
gender=unicode('F')
else: pass# gender is not defined, NameError possible
答案 1 :(得分:0)
首先,不应使用except
而不指定要捕获的内容。它可能导致一些调试问题。
在您的情况下,您可以使用dict.get()
method:
如果
key
在字典中,则返回key
的值,否则返回default
。如果未给出default
,则默认为None
,因此此方法永远不会引发KeyError
。
所以我们得到类似的东西:
genders = {'male': unicode('M'), 'female': unicode('F')}
# if gender isn't found or isn't equal to 'male' or 'female', we return 'NULL'
gender = genders.get(json_dict.get('gender'), unicode('NULL'))
birthday = json_dict.get('birthday')
if len(birthday) == 10:
birthday = int(birthday[6:])
else:
birthday = unicode('NULL')
等等