如何用小写键编组 JSON
How to marshal JSON with lowercase keys
我使用 AWS Lambda 和使用 golang 的 DynamoDB。
我的 DynamoDB table 使用小写属性名称,例如 id
或 name
.
在 Go 中,如果我想能够正确编组结构,我必须以大写字母开头命名字段。
type Item struct {
ID string
Name string
}
要将项目放入我的 DynamoDB table,我必须使用 dynamodbattribute.MarshalMap
函数将其编组到 map[string]*dynamodb.AttributeValue
。
item := Item{
ID: "xxxx",
Name: "yyyy"
}
av, _ := dynamodbattribute.MarshalMap(item)
当然,这将创建一个 map
,使用写成 ID
和 Name
的名称,它们与 id
和 name
不兼容dynamodb table.
阅读文档,我发现您可以使用自定义编码器,并启用 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。
您可以将它们添加到您正在编组的类型中,如下所示:
type Item struct {
ID string `dynamodbav:"id"`
Name string `dynamodbav:"name"`
}
我使用 AWS Lambda 和使用 golang 的 DynamoDB。
我的 DynamoDB table 使用小写属性名称,例如 id
或 name
.
在 Go 中,如果我想能够正确编组结构,我必须以大写字母开头命名字段。
type Item struct {
ID string
Name string
}
要将项目放入我的 DynamoDB table,我必须使用 dynamodbattribute.MarshalMap
函数将其编组到 map[string]*dynamodb.AttributeValue
。
item := Item{
ID: "xxxx",
Name: "yyyy"
}
av, _ := dynamodbattribute.MarshalMap(item)
当然,这将创建一个 map
,使用写成 ID
和 Name
的名称,它们与 id
和 name
不兼容dynamodb table.
阅读文档,我发现您可以使用自定义编码器,并启用 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。
您可以将它们添加到您正在编组的类型中,如下所示:
type Item struct {
ID string `dynamodbav:"id"`
Name string `dynamodbav:"name"`
}