一、gin接收json数组
1、前端请求的json数据格式如下:
{
"id": "aadd",
"users":[{"userid":"123a","remark":"3sdff"},{"userid":"345b","remark":"ok"}]
}
2、后台定义结构体来接收这个json对象:
type UsersInfo struct {
Id string `gorm:"column:id" json:"id"` //
Users json.RawMessage `gorm:"column:users;type:json" json:"users"` //
}
users属性的类型定义成json.RawMessage,再定义一个对象来解析users数组内的对象:
type UserInfo struct {
UserId string `gorm:"column:userid" json:"userid"` //
Remark string `json:"remark"`
}
如果这两个结构体,只负责接收前端参数,不需要映射数据库记录时,gorm部分可以去掉。
3、gin接收参数并解析json数组中的内容:
// 保存整体json对象
var usersInfo UsersInfo
// c是*gin.Context对象
_ = c.ShouldBindJSON(&usersInfo)
// 保存json数组内容的对象
var userArr []*UserInfo
//序列化json数组对象,得到byte数组
joinBytes, _ := usersInfo.Users.MarshalJSON()
//解析byte数组,赋值给userArr
//如果Users不是结构化的json数组,则将其转化为map数组
json.Unmarshal(joinBytes, &joinArr)
for i := 0; i < len(joinArr); i++ {
fmt.Println(joinArr[i].UserId);
fmt.Println(joinArr[i].Remark);
}
4、mysql数据库表中的字段类型为json时,对应结构体的属性类型,也要定义为json.RawMessage,可以直接保存到数据库和从数据库直接查询出来。