如何将地图从 DynamoDB 解组到结构?

问题描述

发电机上有以下字段

{

      "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 返回的值分配给我的结构?

解决方法

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

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

一旦您正确构造了结构体,您还会注意到您的结构体字段没有大写,这意味着它们不会被导出(即可以被其他包使用),这是您的 {{1 }} 代码不会返回您期望的结果。

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

以下是您的结构的更正版本,结合您的 UnmarshalMap 代码,将正确地允许您打印您的 UnmarshalMap 而不会收到一个 item,这很不有趣。

{}