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

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.