如何使用小写键封送JSON

Ludonope:

我使用golang将AWS Lambda与DynamoDB结合使用。

我的DynamoDB表使用小写的属性名称,例如idname

在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使用的名字写为IDName,这是不符合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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章