看我上一篇隨筆 https://www.cnblogs.com/zengxm/p/13473340.html
其中使用mysql原始語句查詢結果並返回
上一篇隨筆代碼
並想直接映射到結構體中,后來發現結構體序列化時有個坑
這次實際操作了一下解決了
代碼如下
type Curriculums struct { CID int `gorm:"column:c_id" json:"cid"` UID int `gorm:"column:u_id" json:"uid"` //TID int `gorm:"column:t_id" json:"tid"` Name string `gorm:"column:c_name" json:"title"` Price float64 `gorm:"column:price" json:"price"` Info string `gorm:"column:info" json:"info"` Image string `gorm:"column:c_image" json:"img"` CreateTime *time.Time `gorm:"column:create_at" json:"at"` DeleteTime *time.Time `gorm:"column:delete_at" json:"et"` AdminDelTime *time.Time `gorm:"column:admin_del" json:"a_del"` // 后台人員刪除時間 Aid int `gorm:"column:a_id" json:"aid"` // 后台執行人信息 } func (cr *Curriculums)TableName()string{ return "curriculums" } type User struct { ID uint64 `gorm:"column:u_id" json:"uid,omitempty"` Nickename string `gorm:"column:nickename" json:"nick,omitempty"` Username string `gorm:"column:username" json:"uname,omitempty"` Pswd string `gorm:"column:pswd" json:"pswd,omitempty"` Status int `gorm:"column:status" json:"st,omitempty"` RID int `gorm:"column:r_id" json:"rid,omitempty"` Portrait string `gorm:"column:portrait" json:"img,omitempty"` CreateTime *time.Time `gorm:"column:create_at" json:"at,omitempty"` AdminDelTime *time.Time `gorm:"column:admin_del" json:"a_del,omitempty"` // 后台人員刪除時間 Aid int `gorm:"column:a_id" json:"aid,omitempty"` // 后台執行人信息 } func (u *User)TableName()string{ return "users" } type SelectData struct { User JsonStr string `gorm:"column:datas" json:"datas,omitempty"` MarshalerData []Curriculums `json:"datas,omitempty" ` } func main(){ var result []SelectData SQL := "SELECT u.u_id,u.nickename,u.username, " + "CONCAT(\"[\",GROUP_CONCAT('{','\"cid\":',c.c_id,',\"title\":\"',c.c_name,'\",\"price\":',c.price,',\"info\":\"',c.info,'\"}'),\"]\") as datas " + "FROM users AS u " + "JOIN curriculums AS c " + "ON c.u_id = u.u_id " + "WHERE c.c_name like '%o%' GROUP BY u.u_id" conn.Raw(SQL).Scan(&result) for index,_ := range result{ result[index].JsonStr = strings.Replace(result[index].JsonStr,"\n","",-1) //fmt.Println(result[index]) /* {{100000 acfun 7745742641 0 0 <nil> <nil> 0} [{"cid":102,"title":"python 學習","price":20.00,"info":"python "},{"cid":103,"title":"golang 學習","price":70.79,"info":"go語言 gin框架"}] {[]}} {{100006 giligililllsa666 z99999es 0 0 <nil> <nil> 0} [{"cid":117,"title":"測試保存視頻,視頻url保存在阿里雲oss上","price":9.99,"info":"test in"}] {[]}} */ b,err := json.Marshal(result[index]) if err != nil { panic(err) } fmt.Println(string(b)) /*
上面輸出與序列化對比丟失了 datas 數據 {"uid":100000,"nick":"acfun","uname":"7745742641"} {"uid":100006,"nick":"giligililllsa666","uname":"z99999es"}
*/ } }
后來經過排查發現是結構體中內嵌結構體並被命名后產生的坑
type SelectData struct { User JsonStr string `gorm:"column:datas" json:"datas,omitempty"` MarshalerData []Curriculums `json:"datas,omitempty" ` # 內嵌結構體被命名了,被命名內嵌結構體如果不指定該命名則不會序列化 }
避免產生則需要添加一個中間結構體,修改如下
type Mid struct { d []Curriculums // 小寫避免被序列化 } type SelectData struct { User JsonStr string `gorm:"column:datas" json:"datas,omitempty"` //MarshalerData []Curriculums `json:"datas,omitempty" ` Mid }
success: {"uid":100000,"nick":"acfun","uname":"7745742641","datas":"[{\"cid\":102,\"title\":\"python 學習\",\"price\":20.00,\"info\":\"python \"},{\"cid\":103,\"title\":\"golang 學習\",\"price\":70.79,\"info\":\"go語言 gin框架\"}]"} {"uid":100006,"nick":"giligililllsa666","uname":"z99999es","datas":"[{\"cid\":117,\"title\":\"測試保存視頻,視頻url保存在阿里雲oss上\n\",\"price\":9.99,\"info\":\"test in\"}]"}
下次記得使用原始sql語句查詢結果並序列化是對內嵌結構體需要注意~~~~~~~~~~~~~~~~
參考資料:
https://www.cnblogs.com/staff/p/13223443.html
https://www.it1352.com/809480.html (重點)
-----------------------------------------------------------分割線-------------------------------------------------------------------
本筆記自用 而已,如有錯誤請指正!