【发布时间】:2018-06-15 01:12:13
【问题描述】:
我将 AWS Lambda 与使用 golang 的 DynamoDB 结合使用。
我的 DynamoDB 表使用小写的属性名称,例如 id 或 name。
在 Go 中,如果我希望能够正确编组结构,我必须以大写字母开头的字段命名。
type Item struct {
ID string
Name string
}
要将项目放入我的 DynamoDB 表中,我必须使用 dynamodbattribute.MarshalMap 函数将其编组为 map[string]*dynamodb.AttributeValue。
item := Item{
ID: "xxxx",
Name: "yyyy"
}
av, _ := dynamodbattribute.MarshalMap(item)
当然,这将使用写为ID 和Name 的名称创建map,这与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"`
}
【问题讨论】:
-
JSON 标签的格式应该是
json:"id"而不是json="id", per the documentation。 -
是的,我也看到了,谢谢
标签: json go amazon-dynamodb marshalling