如何用小写键编组 JSON

How to marshal JSON with lowercase keys

我使用 AWS Lambda 和使用 golang 的 DynamoDB。

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

在 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,使用写成 IDName 的名称,它们与 idname 不兼容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"`
}

See the docs here