You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 18:09:19