gpt4 book ai didi

go - 将 map[string]DynamoDBAttributeValue 解码为结构

转载 作者:IT老高 更新时间:2023-10-28 13:09:29 31 4
gpt4 key购买 nike

我正在尝试使用 aws-sdk-go 设置 AWS-lambda每当一个新的 user 添加到某个 dynamodb 时都会触发表。

一切正常,但我找不到解码 map map[string]DynamoDBAttributeValue 的方法,例如:

{
"name": {
"S" : "John"
},
"residence_address": {
"M": {
"address": {
"S": "some place"
}
}
}
}

对于给定的结构,例如,User 结构。 Here显示了将 map[string]*dynamodb.AttributeValue 解码到给定接口(interface)的示例,但我找不到使用 map[string]DynamoDBAttributeValue< 执行相同操作的方法 尽管这些类型似乎符合相同的目的。

map[string]DynamoDBAttributeValuegithub.com/aws/aws-lambda-go/events 包中的 events.DynamoDBEvents 返回>。这是我的代码:

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 上这将是一个相当棘手的过程。

有没有一种方法可以将来自 events.DynamoDBEvent 的 DynamoDB 记录解码为具有类似 map[string]*dynamodb 的方法的结构。属性值?

最佳答案

我尝试了您提供的功能,但遇到了 events.DataTypeList 的一些问题,因此我设法编写了以下功能:

// UnmarshalStreamImage converts events.DynamoDBAttributeValue to struct
func UnmarshalStreamImage(attribute map[string]events.DynamoDBAttributeValue, out interface{}) error {

dbAttrMap := make(map[string]*dynamodb.AttributeValue)

for k, v := range attribute {

var dbAttr dynamodb.AttributeValue

bytes, marshalErr := v.MarshalJSON(); if marshalErr != nil {
return marshalErr
}

json.Unmarshal(bytes, &dbAttr)
dbAttrMap[k] = &dbAttr
}

return dynamodbattribute.UnmarshalMap(dbAttrMap, out)

}

关于go - 将 map[string]DynamoDBAttributeValue 解码为结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49129534/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com