如何使用boto3手动将DynamoDB wire协议转换为本机Python对象?
我有一个Lambda被DynamoDB流触发。Lambda进行一些处理,然后在SNS中创建关于主题的通知。理想情况下,我希望在发送给SNS的通知中包含整个新文档,这样下游客户就不必点击DynamoDB来获取数据 我遇到的问题是,来自DynamoDB流的数据是dynamodbwire格式的(映射包括作为键的数据类型)。当我向下游客户发送通知时,我不希望他们必须理解dynamodbwire格式来解析消息(例如,如果我切换到一个新的底层数据存储,那么我就必须重新创建该格式)如何使用boto3手动将DynamoDB wire协议转换为本机Python对象?,python,amazon-dynamodb,boto,boto3,Python,Amazon Dynamodb,Boto,Boto3,我有一个Lambda被DynamoDB流触发。Lambda进行一些处理,然后在SNS中创建关于主题的通知。理想情况下,我希望在发送给SNS的通知中包含整个新文档,这样下游客户就不必点击DynamoDB来获取数据 我遇到的问题是,来自DynamoDB流的数据是dynamodbwire格式的(映射包括作为键的数据类型)。当我向下游客户发送通知时,我不希望他们必须理解dynamodbwire格式来解析消息(例如,如果我切换到一个新的底层数据存储,那么我就必须重新创建该格式) 显然,boto3客户端能够
显然,boto3客户端能够将这种格式解析为Python对象,有没有办法让我自己访问解析器?据我所知,它在从DynamoDB获取数据时会被调用,但我自己找不到调用它的方法。我也有类似的情况,我使用了以下类似的方法:
from boto3.dynamodb.types import TypeDeserializer
deser = TypeDeserializer()
...
<in handler>
for record in event['Records']:
old = record['dynamodb'].get('OldImage')
new = record['dynamodb'].get('NewImage')
if old:
d = {}
for key in old:
d[key] = deser.deserialize(old[key])
从boto3.dynamodb.types导入类型反序列化器
deser=TypeDeserializer()
...
对于事件['Records']中的记录:
old=记录['dynamodb'].get('OldImage')
new=记录['dynamodb'].get('NewImage')
如果是旧的:
d={}
对于旧版本的密钥:
d[key]=反序列化(旧[key])
这种方法适合我。生成的字典
d
包含转换后的对象,而不是传递给处理程序的wire格式版本。由于某种原因,使用类型反序列化器对我不起作用。但是,该实用程序确实:
如果您不想在Lambda函数中模拟pip install
,您可以将此源文件(包含loads()
函数)复制并粘贴到您自己的代码中:
生成的d
对象不能通过json.dumps()序列化为json