如何将map[string]interface{}打印为JSON?及sqlx MapScan格式化问题
解决map[string]interface{}转JSON格式输出及sqlx格式化问题
嘿,我来帮你搞定这两个问题!
1. 如何将map[string]interface{}打印为JSON格式?
Go标准库的encoding/json包就能完美解决这个需求:
- 用
json.Marshal()可以生成紧凑的单行JSON字符串 - 用
json.MarshalIndent()可以生成带缩进、结构清晰的JSON,可读性更强
举个简单的示例:
package main import ( "encoding/json" "fmt" ) func main() { data := map[string]interface{}{ "USER_ID": "JD", "USER_NAME": "John Doe", } // 生成带缩进的JSON jsonStr, err := json.MarshalIndent(data, "", " ") if err != nil { fmt.Println("序列化失败:", err) return } fmt.Println(string(jsonStr)) }
输出的标准JSON格式如下:
{ "USER_ID": "JD", "USER_NAME": "John Doe" }
2. 针对你的sqlx代码的修改方案
你当前用%#v输出的是Go语言的map字面量格式,要改成JSON格式,直接在循环里替换成JSON序列化逻辑就行,同时别忘了完善错误处理和资源释放:
rows, err := db.Queryx(query) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } defer rows.Close() // 确保rows资源被正确释放 for rows.Next() { results := make(map[string]interface{}) err = rows.MapScan(results) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } // 将map序列化为带缩进的JSON jsonData, err := json.MarshalIndent(results, "", " ") if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } // 将JSON输出到响应流 fmt.Fprintln(w, string(jsonData)) } // 检查遍历rows过程中是否出现错误 if err := rows.Err(); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return }
修改后,输出结果就会变成标准的JSON格式,而不是Go的map语法。如果不需要缩进,把json.MarshalIndent换成json.Marshal即可,生成的是一行紧凑的JSON字符串。
内容的提问来源于stack exchange,提问作者sibert
相关产品推荐
相关产品推荐

