如何使用小写键封送JSON

时间:2018-06-14 07:53:33

标签: json go amazon-dynamodb marshalling

我使用go Lamb来使用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)

当然,这会使用名为mapID的名称创建Name,这些名称与dynamodb表中的idname不兼容

阅读文档,我发现您可以使用自定义编码器,并启用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"`
}

1 个答案:

答案 0 :(得分:2)

Dynamo的内置编组,来自MarshalMap(...)可以支持struct标签,类似于json。

您可以将它们添加到您正在编组的类型中,如下所示:

type Item struct {
    ID   string `dynamodbav:"id"`
    Name string `dynamodbav:"name"`
}

See the docs here