在Python中获取并解析wit.ai的JSON响应以提取特定值
解决Wit.ai接口JSON响应的特定值提取问题
看起来你在调用Wit.ai的API获取对话意图和实体信息,但当前的代码存在潜在的报错风险,我来帮你调整一下:
先看你的原始代码
import requests import json r = requests.get('https://api.wit.ai/message?v=20160918&q=%s' % speech, headers={"Authorization": wit_ai_token}) print r.text json_resp = json.loads(r.text) entities = None intent = None if 'entities' in json_resp: entities = json_resp['entities'] intent = json_resp['entities']['time']['value']
问题分析
这段代码有两个容易触发错误的点:
- 直接用
[]索引字典键,如果entities里没有time字段,或者time的结构不是你预期的单个对象,会直接抛出KeyError - Wit.ai返回的
entities下的字段几乎都是数组类型(因为可能识别到多个同类型实体),不是单个包含value的对象,直接取['time']['value']肯定会报错
修正后的代码
import requests import json # 假设speech和wit_ai_token已经提前定义 r = requests.get('https://api.wit.ai/message?v=20160918&q=%s' % speech, headers={"Authorization": wit_ai_token}) print(r.text) json_resp = json.loads(r.text) # 用get方法安全获取entities,不存在则返回空字典 entities = json_resp.get('entities', {}) intent = None # 先检查time实体是否存在,且数组不为空 if 'time' in entities and len(entities['time']) > 0: # 取数组第一个元素的value,用get避免字段缺失 intent = entities['time'][0].get('value')
关键改进点
- 使用
dict.get(key, default)代替直接索引,即使键不存在也不会报错,而是返回你指定的默认值 - 针对Wit.ai的返回结构,先确认
time数组有内容,再取第一个元素的value - 代码更健壮,能处理实体缺失、识别结果为空等边缘情况
举个例子,如果你的响应是:
{"_text":"is it too late to book a flight tomorrow","entities":{"time":[{"value":"2024-05-22T00:00:00.000-07:00","type":"value"}]}}
修正后的代码会正确提取到2024-05-22T00:00:00.000-07:00作为intent的值。
内容的提问来源于stack exchange,提问作者mrritunjay pathak
相关产品推荐
相关产品推荐

