python-3.x - 从 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)
解决方案
经过这么多的研发,我能够找到解决方案是用逗号分割字符串,然后重新创建一个 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)
推荐阅读
- apache-spark - 客户端无法通过以下方式进行身份验证:[TOKEN, KERBEROS)
- python - 根据另一列中的值重命名列
- ffmpeg - 将立体声文件转换为单声道但保留峰值和 RMS 响度
- python - Python 3 提取 html 数据
- plsql - 计算 is_rail、is_road 和 is_air 的运输次数
- rxjs - Angular 8补丁请求httpclient.subscribe()没有响应,错误或()
- c# - 中间有蓝色背景和白色图像的 UWP Tile
- c++ - 什么时候使用 C++ 的 C 子集会不好?
- java - 从文件中只读取一行整数
- python - sage 错误:没有名为 pygments.token 的模块