首页 > 解决方案 > 从 AWS SQS 读取消息并将其放入 AWS DynamoDB 后 Python dict 数据类型错误

问题描述

我的用例是使用 python 中的 lambda 函数从 SQS 主体获取 JSON 消息并将数据插入 DynamoDB。问题是我能够从 SQS 队列读取 JSON 消息并将其打印到云监视日志中,但是当我尝试在 dynamoDB 中插入相同的 JSON 时,它给出以下错误

参数项的类型无效,值:{'name': 2},类型:class 'str',有效类型:class 'dict'

下面是我正在使用的 lambda 代码,在我尝试使用 put_item 插入的第 12 行发生错误

import json
import boto3

dynamodb = boto3.resource('dynamodb')
dynamoTable = dynamodb.Table('message')

def lambda_handler(event, context):
    for record in event['Records']:
        data1 = record["body"]
        jsondata1 = json.loads(data1)
        print(jsondata1)
        dynamoTable.put_item(Item=jsondata1)      

但是,它能够将 SQS JSON 打印到云监视日志,如下所示 在此处输入图像描述

标签: python-3.xaws-lambdaamazon-dynamodbboto3amazon-sqs

解决方案


经过这么多的研发,我能够找到解决方案是用逗号分割字符串,然后重新创建一个 json,这将创建 dict 数据类型而不是字符串的 json

以下是相同解决方案的代码

import json
import boto3
import ast

dynamodb = boto3.resource('dynamodb')
dynamoTable = dynamodb.Table('message')

def lambda_handler(event, context):
    for record in event['Records']:
        data1 = record["body"]
        jsondata1 = json.loads(data1)
        mess1 = jsondata1["Message"]
        id = jsondata1["MessageId"]
        jsonmess = json.loads(mess1)
        s = jsonmess.replace("{" ,"")
        finalstring = s.replace("}" , "")
        split = finalstring.split(",")
        dict = {'messageID':id}
        for x in split:
            keyvalue = x.split(":")
            print(keyvalue)
            dict[keyvalue[0]]=keyvalue[1]
        dynamoTable.put_item(Item=dict)

推荐阅读