我使用golang将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
,这是不符合id
,并name
从dynamodb表。
阅读文档后,我发现您可以使用自定义编码器并启用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"`
}
Dynamo内置的封送处理功能,MarshalMap(...)
可以支持类似于json的struct标签。
您可以将它们添加到要编组的类型中,如下所示:
type Item struct {
ID string `dynamodbav:"id"`
Name string `dynamodbav:"name"`
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句