上传JSON至DynamoDB时遭遇字符串错误求助
问题根源与解决方案
你遇到的核心问题是DynamoDB的Resource API不接受AttributeValue格式的数据——你的JSON是DynamoDB低层级Client API使用的结构(每个值用{s: "xxx"}包装),但你用的boto3.resource('dynamodb')提供的Table接口,期望的是原生Python数据类型(直接传字符串、数字等,不需要额外包装),这就是字符串错误的来源。
解决步骤
1. 先搞清楚两种API的差异
- Client API(
boto3.client('dynamodb')):需要手动构造AttributeValue格式(比如{'S': 'string'}) - Resource API(你正在使用的):自动处理类型转换,只需要传入普通的键值对字典
2. 方案一:手动转换数据(适合纯字符串场景)
直接提取每个字段的s值,生成Resource API能识别的原生字典:
import boto3 import json # 加载你的JSON文件 with open('your-json-file.json', 'r') as f: raw_dynamo_data = json.load(f) # 转换为Resource API需要的格式 clean_item = {key: value['s'] for key, value in raw_dynamo_data.items()} # 写入DynamoDB dynamodb = boto3.resource('dynamodb', region_name='us-west-2') table = dynamodb.Table('Entities') try: response = table.put_item(Item=clean_item) print(f"数据写入成功!响应信息: {response}") except Exception as e: print(f"写入失败,错误信息: {str(e)}")
3. 方案二:使用TypeDeserializer(通用方案,支持所有DynamoDB类型)
如果你的数据后续可能包含数字、布尔值、列表等其他类型,用boto3内置的TypeDeserializer自动转换更稳妥:
import boto3 import json from boto3.dynamodb.types import TypeDeserializer # 初始化反序列化器 deserializer = TypeDeserializer() # 加载原始JSON with open('your-json-file.json', 'r') as f: raw_dynamo_data = json.load(f) # 转换每个字段 clean_item = { key: deserializer.deserialize(value) for key, value in raw_dynamo_data.items() } # 写入DynamoDB dynamodb = boto3.resource('dynamodb', region_name='us-west-2') table = dynamodb.Table('Entities') try: response = table.put_item(Item=clean_item) print(f"数据写入成功!响应信息: {response}") except Exception as e: print(f"写入失败,错误信息: {str(e)}")
额外提示
如果你想保留AttributeValue格式的写法,可以改用Client API:
client = boto3.client('dynamodb', region_name='us-west-2') client.put_item(TableName='Entities', Item=raw_dynamo_data)
不过Resource API的写法更简洁直观,日常使用更推荐前者。
内容的提问来源于stack exchange,提问作者Tamar
相关产品推荐
相关产品推荐

