使用 AWS SDK CPP 将项目放入 Amazon DynamoDB 中,使用 JSON 格式的项目作为输入

问题描述

是否有任何简单的方法可以使用 AWS SDK CPP 将项目放入 Amazon DynamoDB 中,并使用 JSON 格式的项目作为输入?类似的东西

Aws::DynamoDB::Model::PutItemRequest request;
request.SetTableName(table);
request.FunctionThatSetsAllAttributesParsingAJsonString(json_string);

还是总是需要设置每个属性及其类型?

Aws::DynamoDB::Model::PutItemRequest request;
request.SetTableName(table);
Aws::DynamoDB::Model::AttributeValue val1;
val1.SetS(str);
request.AddItem(key,val1);
Aws::DynamoDB::Model::AttributeValue val2;
...

解决方法

如果 JSON 对象遵循 Amazon DynamoDB JSON 格式,您可以轻松将其转换为 Aws::Map<:string aws:: dynamodb::model::attributevalue> 对象。例如,对于 Jsoncpp Json::Value 对象:

Aws::Map<Aws::String,Aws::DynamoDB::Model::AttributeValue> json2atts(const Json::Value& json) {
    try {
        Aws::Map<Aws::String,Aws::DynamoDB::Model::AttributeValue> amap;
        Aws::Utils::Json::JsonValue jval(Json::FastWriter().write(json));
        if (!jval.WasParseSuccessful()) {
            throw exception("Failed to parse input JSON");
        };
        Aws::Utils::Json::JsonView jview = jval.View();
        Aws::Map<Aws::String,Aws::Utils::Json::JsonView> jmap = jview.GetAllObjects();
        for(auto& i : jmap) {
            amap[i.first] = i.second.AsObject();
        };
        return amap;
    }
    catch (std::exception &e) { 
       ...
    };
};

然后,放置 Aws::Map<:string aws::dynamodb::model::attributevalue> 对象:

Aws::DynamoDB::Model::PutItemRequest request;
request.SetTableName(table);
request.SetItem(amap);