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))
}
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.