替代多个try / except语句以检查字段是否存在

时间:2014-02-17 14:38:09

标签: json api python-2.7

我从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

然后继续。这种方法有效,但它似乎有点......笨拙?它适用于我的目的,因为我只是在寻找六个字段左右。是否有更好/更聪明的方法来扩展这个过程?

2 个答案:

答案 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')

等等