【问题标题】:how to unmarshal a map from DynamoDB to struct?如何将 DynamoDB 中的映射解组为结构?
【发布时间】:2021-01-19 08:08:51
【问题描述】:

发电机上有如下字段

{

      "config": {
        "BASE_AUTH_URL_KEY": "https://auth.blab.bob.com",
        "BASE_URL": "https://api.dummy.data.com",
        "CONN_TIME_OUT_SECONDS": "300000",
        "READ_TIME_OUT_SECONDS": "300000"
      },
      "id": "myConfig"
    }
and getting the element with dynamodbattribute

    import(
        "github.com/aws/aws-sdk-go/service/dynamodb"
        "github.com/aws/aws-sdk-go/service/dynamodb/dynamodbattribute")

    result, err := svc.GetItem(&dynamodb.GetItemInput{
        TableName: aws.String(tableName),
        Key: map[string]*dynamodb.AttributeValue{
            "id": {
                S: aws.String(configId),
            },
        },
    })

这段代码可以正常工作,但是当我尝试检索它呈现的对象时

    map[config:{
      M: {
        BASE_AUTH_URL_KEY: {
          S: "https://auth.blab.bob.com"
        },
        CONN_TIME_OUT_SECONDS: {
          S: "300000"
        },
        READ_TIME_OUT_SECONDS: {
          S: "300000"
        },
        BASE_URL: {
          S: "https://api.dummy.data.com"
        }
      }
    } id:{
      S: "myConfig"
    }]

因此,当我尝试解组我的对象时,解组的对象返回为 {}

type Config struct {
    id                  string
    baseAuthUrlKey      string
    baseUrl             string
    connectTimeOutSecs  string
    readTimeOutSecs     string
}

item := Config{}
err = dynamodbattribute.UnmarshalMap(result.Item, &item)

如何将似乎是映射的 GetItem 的返回值分配给我的结构?

【问题讨论】:

标签: go dynamo-local


【解决方案1】:

问题的根源在于您的 Config 结构结构不正确。

我建议在将 JSON 转换为 Go 结构时使用 json-to-go;此工具将帮助您在未来发现此类问题。

一旦你正确构建了你的结构,你还会注意到你的结构字段没有大写,这意味着它们不会被导出(即能够被其他包使用),这是你的另一个原因UnmarshalMap代码不会返回您期望的结果。

Here 是关于结构字段可见性及其重要性的一个很好的答案,上面简要总结了。

下面是您的结构的更正版本,结合您的UnmarshalMap 代码,将正确地允许您打印您的item 而不会收到{},这很不好玩。

type Item struct {
    Config struct {
        BaseAuthUrlKey     string `json:"BASE_AUTH_URL_KEY"`
        BaseUrl            string `json:"BASE_URL"`
        ConnTimeoutSeconds string `json:"CONN_TIME_OUT_SECONDS"`
        ReadTimeoutSeconds string `json:"READ_TIME_OUT_SECONDS"`
    } `json:"config"`
    ID string `json:"id"`
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    相关资源
    最近更新 更多