使用Amazon Alexa加载json文件



我正在创建一个应用程序,用于搜索亚马逊Alexa的航班连接。我正试图将一个包含机场信息的json文件加载到一个变量中,以便稍后从中搜索数据。我试图将它加载到一个全局变量中,但没有成功。然后我尝试将它加载到session_attributes中,但这也失败了。json文件包含12668个条目。我做错了什么?这样做的好方法是什么?将json加载到变量中是否花费了太多时间,Alexa因此退出?

json文件位于alexa开发者控制台的lambda文件夹中,其中包含代码的文件也是.

Alexa用";请求技能的响应"存在问题;

"error": {
"type": "INVALID_RESPONSE",
"message": "An exception occurred while dispatching the request to the skill."
}

这是我的基本代码:

airportdata = []

def init():
airportdata = load_airport_data()

def load_airport_data():
with open('airportdata.json', encoding="utf8") as json_file: 
return json.load(json_file)

class LaunchRequestHandler(AbstractRequestHandler):
def can_handle(self, handler_input):
return ask_utils.is_request_type("LaunchRequest")(handler_input)
def handle(self, handler_input):
# init()

session_attr = handler_input.attributes_manager.session_attributes
session_attr['airportdata'] = load_airport_data()
speak_output = "Welcome to the App. From where will you departure?"

return (
handler_input.response_builder
.speak(speak_output)
.ask(speak_output)
.response
)

编辑:原来使用的路径不正确。应该是"/var/task/airportdata.json";而不仅仅是json文件的名称。lambda的文件被复制到那里。然后它按预期工作。

不要将其加载到会话属性中。即使它没有超过最大属性大小,它也会在每个后续请求中来回发送。非常昂贵的做事方式。

你没有提到文件有多大。将一个非常大的文件从文本解析为对象在计算上是昂贵的。你不想每次打电话都这么做,也不想真的打任何电话。您应该将其正确存储在数据库中,并运行对数据库的API调用。

最后,如果你在AWS Lambda中运行这个,特别是如果你使用Alexa Hosted,请查看你的CloudWatch日志,看看实际错误是什么。

可能值得考虑的几点:

  • 你能增加内存分配和/或增加lambda超时吗?增加内存分配也为lambda函数提供了更多的CPU能力,这可以加快读取JSON文件的速度
  • 只有在需要完成请求时才读取JSON文件,例如,除非您使用该信息在LaunchRequest响应中提供一些上下文,否则不加载它可以节省时间,并且只为特定的IntentRequest加载它
  • 使用会话属性,但仅用于特定于该会话的数据(例如,用户选择的出发地和目的地机场(。这将再次帮助您避免加载大型JSON文件,除非严格要求。也就是说,避免将整个JSON数据结构存储在会话属性中
  • 考虑到它是一个相对较大的对象,你能通过使用不同的解码器或库来减少加载时间吗

最新更新