dongzhucha3999 2018-04-07 20: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-07 21: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 pycharm倒入虚拟环境的时候,显示这个,但是我的虚拟环境已经创建了
  • ¥15 FPGA芯片60进制计数器
  • ¥15 前端js怎么实现word的.doc后缀文件在线预览
  • ¥20 macmin m 4连接iPad
  • ¥15 DBIF_REPO_SQL_ERROR
  • ¥15 根据历年月数据,用Stata预测未来六个月汇率
  • ¥15 DevEco studio开发工具 真机联调找不到手机设备
  • ¥15 请教前后端分离的问题
  • ¥100 冷钱包突然失效,急寻解决方案
  • ¥15 下载honeyd时报错 configure: error: you need to instal a more recent version of libdnet
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部