Azure Python SDK Service Bus接收消息JSON序列化报错求助
问题原因
receiver.receive_messages()返回的是ServiceBusReceivedMessage类的实例,不是直接的JSON字符串或Python字典,直接将该实例传入json.dumps()会触发序列化不支持的报错。- 之前执行
print(str(msg))可以输出JSON格式内容,是因为该类重写了__str__方法直接返回消息体的字符串形式,不代表对象本身可以直接被JSON序列化。 - 代码逻辑存在操作颠倒:
json.dumps()的作用是将Python字典转为JSON字符串,而你需要的是把消息体的JSON字符串转为Python字典来提取字段,应该调用json.loads()而非json.dumps()。
解决方法
只需要修改消息解析部分的代码即可:
- 先提取
ServiceBusReceivedMessage实例的消息体,转为UTF-8编码的字符串 - 再用
json.loads()将JSON字符串解析为Python字典,即可正常提取Text字段
修改后的核心代码片段:
for msg in received_msgs: # 提取消息体转为UTF-8字符串,该写法比str(msg)更稳定,避免特殊编码场景出错 msg_str = b''.join(msg.body).decode('utf-8') # 解析为Python字典 message = json.loads(msg_str) text = message['Text'] # 后续调用AWS Comprehend的逻辑可以保留,这里还可以优化多余的序列化操作: # comprehend.detect_sentiment 本身返回Python字典,无需先dumps再loads,可直接取字段 result = comprehend.detect_sentiment(Text=text, LanguageCode='en') sentiment = result["Sentiment"] # 后续提取分数、生成输出的原有逻辑保持不变即可
内容的提问来源于stack exchange,提问作者Nayden Van
相关产品推荐
相关产品推荐

