SQS消费者解析嵌套JSON消息失败,报KeyError: 'mail'求助
解决SQS消息嵌套JSON解析的KeyError问题
核心思路
不用正则的话,直接用JSON标准解析工具做两层解析:先解析外层SNS通知的JSON结构,取出Message字段对应的字符串后,再对这个字符串做一次JSON解析,就能得到包含mail、notificationType等字段的字典。
代码实现(Python示例)
假设你用Python处理消息,直接用内置的json模块即可:
import json def parse_sqs_message(message_body): # 第一步:解析外层JSON outer_data = json.loads(message_body) # 判断是否是SNS格式的消息 if "Message" in outer_data: # 第二步:解析Message字段里的嵌套JSON字符串 inner_data = json.loads(outer_data["Message"]) return inner_data else: # 直接返回正常格式的消息数据 return outer_data # 使用示例 # 模拟SNS格式的消息 sns_message = '{"Type": "Notification", "Message": "{\"notificationType\": \"Complaint\", \"mail\": {\"timestamp\": \"2024-01-01\"}}"}' # 模拟正常格式的消息 normal_message = '{"notificationType": "Bounce", "mail": {"timestamp": "2024-01-02"}}' # 解析两种消息 print(parse_sqs_message(sns_message)) print(parse_sqs_message(normal_message))
为什么不用正则?
正则处理JSON字符串很容易踩坑——比如遇到转义引号、嵌套结构时,正则表达式会变得复杂且容易出错,而标准的JSON解析器能完美处理这些边界情况,保证解析的准确性。
额外提示
如果需要处理更复杂的异常情况(比如Message字段不是合法JSON),可以加一层异常捕获:
def parse_sqs_message_safe(message_body): try: outer_data = json.loads(message_body) if "Message" in outer_data: try: return json.loads(outer_data["Message"]) except json.JSONDecodeError: # 处理Message字段解析失败的情况,比如返回原始数据或抛出自定义异常 return outer_data return outer_data except json.JSONDecodeError: # 处理外层JSON解析失败的情况 return None
内容的提问来源于stack exchange,提问作者DevOpsSauce
相关产品推荐
相关产品推荐

