如何解析map[string]*dynamodb.AttributeValue?Movies列表为空排查
你的代码里UnmarshalMap的用法本身是正确的,但Movies列表为空大概率是以下几个原因导致的:
1. 操作类型与输出结构不匹配
如果你的查询用的是Query(而非GetItem),返回的结果是QueryOutput,其中的Items是数组类型([]map[string]types.AttributeValue),而非单个Item。直接用tableOutput.Item会拿到空值或不符合预期的结构,自然解析不出数据。
如果是Query操作,正确处理方式是遍历Items数组:
var results []Database for _, item := range tableOutput.Items { var dbEntry Database if err := dynamodbattribute.UnmarshalMap(item, &dbEntry); err != nil { log.Println(err) return nil, err } results = append(results, dbEntry) } // 根据实际需求提取List字段,示例取第一条结果 return results[0].List, nil
2. DynamoDB字段名与结构体标签不匹配
Database结构体中List字段的dynamodbav标签是"movies",这要求DynamoDB表中的对应字段名必须完全一致(大小写敏感)。如果表中字段名是"movie"或其他拼写,会导致映射失败,List保持为空。
可以打印tableOutput.Item内容确认是否存在"movies"键:
log.Printf("Item content: %v", tableOutput.Item)
如果输出里没有"movies",要么是字段名写错,要么是查询未返回该字段。
3. DynamoDB中字段类型不匹配
DynamoDB里的movies字段必须是列表类型(List),且每个元素是包含movie和year字段的Map类型。如果movies被存成字符串类型(比如直接存JSON数组字符串),UnmarshalMap无法自动解析为结构体切片,也会导致List为空。
这种情况需要要么修改存储结构,把movies存为List类型;要么先将字符串转成JSON,再手动解析。
4. 结构体定义的细节(不影响解析但可优化)
你的Movies结构体字段名是Movie和Year,对应标签是"movie"和"year",这个映射是正确的,但可以统一风格(比如字段名改用小写movie),不影响功能。
内容的提问来源于stack exchange,提问作者hmdevno

