我刚刚读入了一个JSON对象,现在我想将它作为结构化数据对象存储到DynamoDB中。
在Python中,这很容易:
data = {
"id": str(time.time()),
"metadata": {
"author": "Me",
"version": "0.7.1"
},
"values": [1.2235253, 1.4235235]
}
dynamodb = boto3.resource("dynamodb", region_name="eu-west-2")
table = dynamodb.Table("MyTable")
cleaned_data = json.loads(json.dumps(data), parse_float=Decimal)
table.put_item(Item=cleaned_data)
在 rust ...这是我的代码,但它的错误:
use rusoto_core::Region;
use rusoto_dynamodb::{AttributeValue, DynamoDb, DynamoDbClient, PutItemInput};
use serde_json::{json, Value};
// JSON file to hashmap
let contents = fs::read_to_string("tests/fixtures/event.json").expect("Unable to read file");
let data: HashMap<String, Value> = serde_json::from_str(contents).unwrap();
write_to_dynamodb(data).await;
// Hashmap to DynamoDB
async fn write_to_dynamodb(data: HashMap<String, Value>) -> Result<(), Box<dyn std::error::Error>> {
let client = DynamoDbClient::new(Region::EuWest2);
client.put_item(PutItemInput{
item: data,
table_name: "MyTable".to_string(),
..PutItemInput::default()
}).await?;
Ok(())
}
我在item: data
行上得到以下错误:
item: data
^^^^ expected struct `AttributeValue`, found enum `Value`
note: expected struct `HashMap<_, AttributeValue>`
found struct `HashMap<_, Value>`
看起来DynamoDB需要一个与serde_json
不同的数据结构。我应该使用类似serde_dynamo
的数据结构吗?如果是,应该如何使用?
NB我事先不知道JSON对象的结构。
1条答案
按热度按时间6ojccjat1#
我没有使用过
serde_dynamodb
,但它似乎提供了以下功能:from_hashmap
-从HashMap<String, AttributeValue>
反序列化T
类型的示例。to_hashmap
-将给定的数据结构序列化为HashMap<String, AttributeValue>
。在您的示例中,您使用了
HashMap<String, serde_json::Value>
,但似乎没有必要,您可以直接将JSON字符串反序列化为serde_json::Value
。您应该能够通过
to_hashmap()
将serde_json::Value
值直接转换为HashMap<String, AttributeValue>
值。serde_dynamodb
和serde_json
都是基于serde
框架的,它们可以被看作分别是DynamoDB和JSON的Serde扩展,因此您应该能够轻松地在这两种结构之间进行转换(Value
和AttributeValue
都实现了Serde的Serialize
和Deserialize
特性)。