dongzhucha3999 2018-04-08 04:25
浏览 34
已采纳

DynamoDB UnmarshalListOfMaps在Go中创建空值

I put-item from json file, my code can output the scan result json, but trying to unmarshal it into my type using the built-in process only creates empty/zero values.

Expected: 0, tomato, 0.50

Actual: 0, , 0

item.json

{
    "id" : {"N" : "0"},
    "description" : {"S": "tomato"},
    "price" : {"N": "0.50"}
}

product.go

type product struct {
    id          int
    description string
    price       float64
}

My query function:

func listAllProducts() []product {
    sess, err := session.NewSession(&aws.Config{
        Region: aws.String("us-east-1"),
    },
    )
    svc := dynamodb.New(sess)
    productList := []product{}

    input := &dynamodb.ScanInput{
        TableName: aws.String("Products"),
    }
    result, err := svc.Scan(input)
    err = dynamodbattribute.UnmarshalListOfMaps(result.Items, &productList)
    return productList
}

Output code

productList := listAllProducts()

    for _, p := range productList {
        log.Println(strconv.Itoa(p.id) + ", " + p.description + ", " + strconv.FormatFloat(p.price, 'f', -1, 64))
    }
  • 写回答

1条回答 默认 最新

  • duanjupiao4730 2018-04-08 05:28
    关注

    The Marshal documentation says:

    All struct fields and with anonymous fields, are marshaled unless the any of the following conditions are meet.

    • the field is not exported

    The Unmarshal documentation doesn't mention anything about non-exported fields but it would be common and expected in Go for unmarshalling to also ignore non-exported fields (you can't even set non-exported fields using Go's reflection after all).

    I don't know my way around DynamoDB but perhaps you would have better luck if your fields were exported:

    type product struct {
        Id          int
        Description string
        Price       float64
    }
    

    There are dynamodbav struct tags available if you need to marshal your struct with lower case field names.

    I would also recommend paying attention to the error that dynamodbattribute.UnmarshalListOfMaps is returning:

    err = dynamodbattribute.UnmarshalListOfMaps(result.Items, &productList)
    if err != nil {
        /* Do something with the error here even if you just log it. */
    }
    

    Similarly for the svc.Scan(input) call and everything else that returns an error.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 wegame打不开英雄联盟
  • ¥15 公司的电脑,win10系统自带远程协助,访问家里个人电脑,提示出现内部错误,各种常规的设置都已经尝试,感觉公司对此功能进行了限制(我们是集团公司)
  • ¥15 救!ENVI5.6深度学习初始化模型报错怎么办?
  • ¥30 eclipse开启服务后,网页无法打开
  • ¥30 雷达辐射源信号参考模型
  • ¥15 html+css+js如何实现这样子的效果?
  • ¥15 STM32单片机自主设计
  • ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢
  • ¥15 不小心不正规的开发公司导致不给我们y码,
  • ¥15 我的代码无法在vc++中运行呀,错误很多