如何在Python中读取AWS SQS消息体并解决JSON解析类型错误
问题分析与解决方法
嘿,我之前处理SQS消息的时候也踩过这个坑!你遇到的报错原因很明确:你直接把sqs.Message对象传给了json.loads(),但这个方法只接受字符串、字节或字节数组类型的输入。
当你用Python的boto3库接收SQS消息时,receive_messages()返回的不是原始的消息内容字符串,而是封装好的sqs.Message对象——这个对象里不仅包含你存入的消息体,还有消息ID、接收句柄、发送时间等元数据。所以直接解析整个对象肯定会报错。
解决步骤
你只需要先从sqs.Message对象中提取出实际的消息体字符串,再用json.loads()解析就行:
- 通过
message.body属性获取队列中存储的JSON字符串; - 对这个字符串执行JSON解析。
修正后的示例代码
import json import boto3 # 初始化SQS客户端 sqs = boto3.client('sqs') queue_url = '你的SQS队列URL' # 接收消息 messages = sqs.receive_messages(QueueUrl=queue_url) for message in messages: try: # 提取消息体字符串 message_body = message.body # 解析JSON parsed_msg = json.loads(message_body) # 现在可以正常访问消息里的字段了 print(f"机器名称: {parsed_msg['Test']}") print(f"状态: {parsed_msg['State']}") # 处理完消息后记得删除,避免重复接收 message.delete() except json.JSONDecodeError as e: print(f"JSON解析失败: {e}") # 可以根据需要处理解析失败的情况,比如删除消息或者重新入队
额外提醒
如果你是用boto3.resource('sqs')方式初始化的客户端,获取消息体的方式也是一样的——同样通过message.body来访问。另外,确保你发送消息到队列时,确实是用json.dumps()把Python字典转换成了合法的JSON字符串,不过你已经确认存入的是JSON格式,这一步应该没问题。
内容的提问来源于stack exchange,提问作者takanoha
相关产品推荐
相关产品推荐

