如何将Redshift Data API的GetStatementResultOutput转为JSON或结构体?
处理Redshift Data API返回的Field数组
方案一:让Redshift直接返回JSON结果
你可以通过Redshift的SQL函数直接将查询结果转换为JSON格式,拿到的结果就是结构化的JSON字符串,无需在Go端处理复杂的Field数组。常用的函数有ROW_TO_JSON(单条记录转JSON)和JSON_AGG(多条记录转JSON数组)。
示例SQL:
-- 将查询结果转为JSON数组 SELECT JSON_AGG(ROW_TO_JSON(t)) AS result FROM ( SELECT id, name, email FROM your_table WHERE status = 'active' ) t;
执行这个查询后,Redshift Data API返回的Records数组中会包含一个字段,其Value就是完整的JSON数组字符串。你可以直接在Go代码中将这个字符串解析为JSON对象或结构体数组:
// 假设output是ExecuteStatement的返回结果 jsonStr := output.Records[0][0].Value.(string) var results []map[string]interface{} if err := json.Unmarshal([]byte(jsonStr), &results); err != nil { // 处理解析错误 }
方案二:在Go代码中转换Field数组为结构体或JSON
如果需要保留原始查询方式,可手动解析Records中的二维Field数组,将其映射为Go结构体或JSON对象。
步骤说明
- 从
ColumnMetadata中提取列名,对应每行Field的顺序; - 遍历每行记录,将每个Field的值映射到对应列名,生成键值对;
- 将键值对转换为JSON或直接赋值到目标结构体。
代码示例
首先定义目标结构体(以用户表为例):
type User struct { ID int64 `json:"id"` Name string `json:"name"` Email string `json:"email"` }
然后解析Records数组:
// 获取列名列表 var columnNames []string for _, col := range output.ColumnMetadata { columnNames = append(columnNames, *col.Name) } // 转换为结构体数组 var users []User for _, row := range output.Records { user := User{} for i, field := range row { // 处理NULL值 if field.IsNull != nil && *field.IsNull { continue } // 根据列名映射到结构体字段 switch columnNames[i] { case "id": user.ID = field.Value.(int64) case "name": user.Name = field.Value.(string) case "email": user.Email = field.Value.(string) } } users = append(users, user) } // 转换为JSON(如果需要) jsonData, err := json.Marshal(users) if err != nil { // 处理JSON序列化错误 }
注意事项
- Redshift返回的数值类型通常对应Go的
int64或float64,字符串类型直接对应string; - 对于Decimal等高精度类型,建议在SQL中转换为字符串后再处理,避免精度丢失;
- 务必处理
IsNull标记,避免空指针或类型断言错误。
内容的提问来源于stack exchange,提问作者Michael Bonnet
相关产品推荐
相关产品推荐

