我正在尝试使用aws-sdk-go设置 AWS-lambda ,只要将新user
的添加到某个dynamodb表中就会触发。
一切正常,但我找不到解组地图的方法,map[string]DynamoDBAttributeValue
例如:
{
"name": {
"S" : "John"
},
"residence_address": {
"M": {
"address": {
"S": "some place"
}
}
}
}
对于给定的结构,例如,一个User
结构。这里显示了一个将 a 解组到给定接口的示例,但即使这些类型似乎适合相同的目的map[string]*dynamodb.AttributeValue
,我也找不到一种方法来做同样的事情。map[string]DynamoDBAttributeValue
map[string]DynamoDBAttributeValue
由events.DynamoDBEvents
from package返回github.com/aws/aws-lambda-go/events
。这是我的代码:
package handler
import (
"context"
"github.com/aws/aws-lambda-go/events"
"github.com/aws/aws-sdk-go/service/dynamodb/dynamodbattribute"
"github.com/aws/aws-sdk-go/service/dynamodb"
)
func HandleDynamoDBRequest(ctx context.Context, e events.DynamoDBEvent) {
for _, record := range e.Records {
if record.EventName == "INSERT" {
// User Struct
var dynamoUser model.DynamoDBUser
// Of course this can't be done for incompatible types
_ := dynamodbattribute.UnmarshalMap(record.Change.NewImage, &dynamoUser)
}
}
}
当然,我可以编组record.Change.NewImage
为 JSON 并将其解组回给定的结构,但是,我必须dynamoUser
从后者开始手动初始化属性。
或者我什至可以编写一个解析map[string]DynamoDBAttributeValue
为map[string]*dynamodb.AttributeValue
喜欢的函数:
func getAttributeValueMapFromDynamoDBStreamRecord(e events.DynamoDBStreamRecord) map[string]*dynamodb.AttributeValue {
image := e.NewImage
m := make(map[string]*dynamodb.AttributeValue)
for k, v := range image {
if v.DataType() == events.DataTypeString {
s := v.String()
m[k] = &dynamodb.AttributeValue{
S : &s,
}
}
if v.DataType() == events.DataTypeBoolean {
b := v.Boolean()
m[k] = &dynamodb.AttributeValue{
BOOL : &b,
}
}
// . . .
if v.DataType() == events.DataTypeMap {
// ?
}
}
return m
}
然后简单地使用dynamodbattribute.UnmarshalMap
,但在events.DataTypeMap
这将是一个相当棘手的过程。
有没有一种方法可以将来自 a 的 DynamoDB 记录解组events.DynamoDBEvent
为具有类似方法的结构map[string]*dynamodb.AttributeValue
?