我使用go Lamb来使用AWS Lambda和DynamoDB。
我的DynamoDB表使用小写属性名称,例如id
或name
。
在Go中,如果我想能够正确编组结构,我必须命名以大写字母开头的字段。
type Item struct {
ID string
Name string
}
要将项目放入我的DynamoDB表格,我必须使用map[string]*dynamodb.AttributeValue
函数将其编组为dynamodbattribute.MarshalMap
。
item := Item{
ID: "xxxx",
Name: "yyyy"
}
av, _ := dynamodbattribute.MarshalMap(item)
当然,这会使用名为map
和ID
的名称创建Name
,这些名称与dynamodb表中的id
和name
不兼容
阅读文档,我发现您可以使用自定义编码器,并启用json标记。
type Item struct {
ID string `json="id"`
Name string `json="name"`
}
func setOpts(encoder *dynamodbattribute.Encoder) {
// Not sure which one I sould set
// So I set them both :)
encoder.SupportJSONTags = true
encoder.MarshalOptions.SupportJSONTags = true
}
func main() {
encoder := dynamodbattribute.NewEncoder(setOpts)
encoder.Encode(...)
}
但此处encoder.Encode()
方法仅用于创建dynamodb.AttributeValue
,而不是map[string]*dynamodb.AttributeValue
。
有没有办法使用MarshalMap
的自定义编码器?或者我是以错误的方式使用它?
修改
好的,正如Zak指出的那样,可以使用dynamodbav
标签。
我还发现我以错误的方式使用json
标签。我应该使用语法json:"id"
而不是json="id"
。
实际上,DynamoDB SDK使用json标记(如果可用),dynamodbav
可以覆盖此标记。
所以我所要做的就是让我的结构看起来像这样,并且它起作用了
type Item struct {
ID string `json:"id"`
Name string `json:"name"`
}
答案 0 :(得分:2)
Dynamo的内置编组,来自MarshalMap(...)
可以支持struct标签,类似于json。
您可以将它们添加到您正在编组的类型中,如下所示:
type Item struct {
ID string `dynamodbav:"id"`
Name string `dynamodbav:"name"`
}