如何将映射从 DynamoDB 解组到结构?

how to unmarshal a map from DynamoDB to struct?

dynamo上有如下字段

{

      "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"
    }</pre>
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"
    }]

出于这个原因,当我尝试解组我的对象时,对象解组 returns 作为 {}

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

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

如何从 GetItem 中分配值 return,它似乎是我的结构的映射?

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

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

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

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"`
}