【问题标题】:How to marshal JSON with lowercase keys如何使用小写键编组 JSON
【发布时间】:2018-06-15 01:12:13
【问题描述】:

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

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

在 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)

当然,这将使用写为IDName 的名称创建map,这与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"`
}

【问题讨论】:

  • JSON 标签的格式应该是 json:"id" 而不是 json="id", per the documentation
  • 是的,我也看到了,谢谢

标签: json go amazon-dynamodb marshalling


【解决方案1】:

Dynamo 内置 marshalling,从 MarshalMap(...) 可以支持 struct 标签,类似于 json。

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

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

See the docs here

【讨论】:

  • 确实很简单,我在阅读文档方面做得很糟糕,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-19
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 1970-01-01
  • 2019-10-04
  • 2019-12-15
相关资源
最近更新 更多