使用Rust?在DynamoDB中存储JSON对象

1szpjjfi  于 2023-03-18  发布在  其他
关注(0)|答案(1)|浏览(139)

我刚刚读入了一个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对象的结构。

6ojccjat

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_dynamodbserde_json都是基于serde框架的,它们可以被看作分别是DynamoDB和JSON的Serde扩展,因此您应该能够轻松地在这两种结构之间进行转换(ValueAttributeValue都实现了Serde的SerializeDeserialize特性)。

相关问题