我正在尝试解析包含嵌套列表和词典的字典。我正在尝试检测给定的密钥是否存在并将其值保存到适当的变量中。下面的代码有效,但感觉非常混乱。是否有正确/更好的处理方法?
def wit_response(self, message_text=None):
if message_text is not None:
resp = self.client.message(message_text)
print(resp)
try:
intent = resp['entities']['intent'][0]['value']
except:
intent = None
try:
location = resp['entities']['location'][0]['value']
except:
location = None
try:
datetimefrom = resp['entities']['datetime'][0]['values'][0]['from']['value']
except:
datetimefrom = None
try:
datetimeto = resp['entities']['datetime'][0]['values'][0]['to']['value']
except:
datetimeto = None
resp的示例。
{u'entities':{u'intent':[{u'confidence':0.99699357488585,u'value':u'weather'}],u'location':[{u'suggested':是的, u'confidence':0.87101,你''':你''',你''''你喜欢'}}},u'msg_id':u'0jkzwqMkSkpZsKJYx',你'文字':你这是什么天气好像?'}
答案 0 :(得分:3)
如果不使用某种辅助功能或新容器,您将无法缩短时间。一种方法是编写函数:
def try_get(obj, key):
if not key:
return obj
key, _, rest = key.partition('.')
try:
key = int(key)
except ValueError:
pass
try:
return try_get(obj[key], rest)
except (KeyError, IndexError):
return None
并像这样使用它:
intent = try_get(resp, 'entities.intent.0.value')
location = try_get(resp, 'entities.location.0.value')
datetimefrom = try_get(resp, 'entities.datetime.0.values.0.from.value')
datetimeto = try_get(resp, 'entities.datetime.0.values.0.to.value')
JSON不允许使用整数字典键,因此这应该明确允许您遍历从JSON解析的任何对象。