我有一个用键提取JSON数据的类,但问题是,对于这个类的每个实例,JSON数据可能没有我想要抓取的所有内容的键。目前,我的班级设置如下:
class Show():
def __init__(self, data):
self.data = data
self.status = self.data['status']
self.rating = self.data['rating']
self.genres = self.data['genres']
self.weight = self.data['weight']
self.updated = self.data['updated']
self.name = self.data['name']
self.language = self.data['language']
self.schedule = self.data['schedule']
self.url = self.data['url']
self.image = self.data['image']
依此类推,参数不止于此。我试图避免为每个(27)行中的每一个都设置一个try-except块的混乱。有没有更好的办法?最终,如果JSON密钥不存在,我希望为None
分配一个参数。
答案 0 :(得分:2)
如果您要为该属性设置默认值(如果该属性不在data
词典中),请使用data.get('key')
而不是data['key']
。如果密钥不存在,get
方法将返回None
,而不是引发KeyError
异常。如果您想要一个不同于None
的默认值,您可以将第二个参数传递给get
,这将是返回的内容。
所以,你的代码可能变成:
class Show():
def __init__(self, data):
self.data = data
self.status = self.data.get('status')
self.rating = self.data.get('rating')
self.genres = self.data.get('genres')
self.weight = self.data.get('weight')
self.updated = self.data.get('updated')
self.name = self.data.get('name')
self.language = self.data.get('language')
self.schedule = self.data.get('schedule')
self.url = self.data.get('url')
self.image = self.data.get('image')
答案 1 :(得分:1)
使用dict.get
,它提供默认值,而不是为丢失的密钥引发异常。
例如,您可以更改此内容:
self.status = self.data['status']
进入这个:
self.status = self.data.get('status')
答案 2 :(得分:1)
您可以将代码更改为:
class Show():
def __init__(self, data):
self.data = data
self.__dict__.update(data)
data = {'status': True, 'ratings': [1,2,3], 'foo': "blahblah"}
aShow = Show(data)
"""
>>> aShow.status
True
>>> aShow.ratings
[1,2,3]
>>> aShow.something_not_in_dict
AttributeError: Show instance has no attribute 'something_not_in_dict'
"""
完全相同,尝试访问Show
实例中不是data
字典中的密钥的内容会引发AttributeError