Skip to main content
 首页 » 编程设计

python之AWS DynamoDB Stream python 转换原生格式

2025年05月04日15飞鱼

我有一个由 DynamoDB 流触发的 Lambda 函数。我的问题是收到的事件的格式很奇怪(每个键/值都有类型)。

是否存在将整个文档转换为 native python 格式(无任何类型)的解决方法。我正在寻找一个动态解决方案,因为将来我想将此 lambda 与具有不同格式(多个字典/列表级别)的其他 DynamoDB 表流一​​起使用

示例:

{ 
  "Records": [ 
    { 
      "eventID": "1", 
      "eventVersion": "1.0", 
      "dynamodb": { 
        "Keys": { 
          "Id": { 
            "N": "101" 
          } 
        }, 
        "NewImage": { 
          "Message": { 
            "S": "New item!" 
          }, 
          "Id": { 
            "N": "101" 
          } 
        }, 
        "StreamViewType": "NEW_AND_OLD_IMAGES", 
        "SequenceNumber": "111", 
        "SizeBytes": 26 
      }, 
      "awsRegion": "us-west-2", 
      "eventName": "INSERT", 
      "eventSourceARN": "arn:aws:dynamodb:us-west-2:account-id:table/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", 
      "eventSource": "aws:dynamodb" 
    }, 
    { 
      "eventID": "2", 
      "eventVersion": "1.0", 
      "dynamodb": { 
        "OldImage": { 
          "Message": { 
            "S": "New item!" 
          }, 
          "Id": { 
            "N": "101" 
          } 
        }, 
        "SequenceNumber": "222", 
        "Keys": { 
          "Id": { 
            "N": "101" 
          } 
        }, 
        "SizeBytes": 59, 
        "NewImage": { 
          "Message": { 
            "S": "This item has changed" 
          }, 
          "Id": { 
            "N": "101" 
          } 
        }, 
        "StreamViewType": "NEW_AND_OLD_IMAGES" 
      }, 
      "awsRegion": "us-west-2", 
      "eventName": "MODIFY", 
      "eventSourceARN": "arn:aws:dynamodb:us-west-2:account-id:table/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", 
      "eventSource": "aws:dynamodb" 
    }, 
    { 
      "eventID": "3", 
      "eventVersion": "1.0", 
      "dynamodb": { 
        "Keys": { 
          "Id": { 
            "N": "101" 
          } 
        }, 
        "SizeBytes": 38, 
        "SequenceNumber": "333", 
        "OldImage": { 
          "Message": { 
            "S": "This item has changed" 
          }, 
          "Id": { 
            "N": "101" 
          } 
        }, 
        "StreamViewType": "NEW_AND_OLD_IMAGES" 
      }, 
      "awsRegion": "us-west-2", 
      "eventName": "REMOVE", 
      "eventSourceARN": "arn:aws:dynamodb:us-west-2:account-id:table/ExampleTableWithStream/stream/2015-06-27T00:48:05.899", 
      "eventSource": "aws:dynamodb" 
    } 
  ] 
} 

谢谢

请您参考如下方法:

我一直在使用它,直到现在它对我们很有用:

from boto3.dynamodb.types import TypeDeserializer 
 
serializer = TypeDeserializer() 
 
def deserialize(data): 
    if isinstance(data, list): 
        return [deserialize(v) for v in data] 
 
    if isinstance(data, dict): 
        try: 
            return serializer.deserialize(data) 
        except TypeError: 
            return {k: deserialize(v) for k, v in data.items()} 
    else: 
        return data