golang gin框架 结构体如何使用mysql的json类型

golang gin 框架 结构体如何使用 mysql 的 json 类型

最佳答案

你定义一个切片,然后用 json.Unmarshal 解析到你这个切片里面不就完事了

2年前 评论
xingkong12138 (作者) 2年前
my38778570 (楼主) 2年前
讨论数量: 29

这个问题有点怪呀,gin 是 web 框架,这个库本身和 mysql 没有关系呀

2年前 评论
my38778570 (楼主) 2年前

你是想问如何把 mysql 中的 json 数据存储在 golang 的 结构体中吗。

2年前 评论
my38778570 (楼主) 2年前
don178 (作者) 2年前
my38778570 (楼主) 2年前
don178 (作者) 2年前

type Courses struct {

Images             string `gorm:"type:json;default:null;" json:"images" label:"图片"`
gorm.Model

} @d

2年前 评论
don178 2年前
my38778570 (作者) (楼主) 2年前
my38778570 (作者) (楼主) 2年前
don178 2年前
my38778570 (作者) (楼主) 2年前
package main

import (
    "dingjijy-golang/model"
    "dingjijy-golang/routes"
)

func main() {
    // 调用数据库
    model.InitDB()
    // 创建路由
    routes.InitRouter()
}
package routes

import (
    "dingjijy-golang/api/admin"
    "dingjijy-golang/middleware"
    "dingjijy-golang/utils"

    "github.com/gin-gonic/gin"
)

func InitRouter() {
    gin.SetMode(utils.AppMode)
    r := gin.Default()

    // 简单的路由组: v1
    adminRouterGroup := r.Group("api/admin")
    {
        adminRouterGroup.POST("login", admin.Login)
        adminRouterGroup.POST("upload", admin.Upload)
    }

    authAdminRouterGroup := r.Group("api/admin").Use(middleware.JwtToken())
    {
        authAdminRouterGroup.POST("categories/store", admin.StoreCategories)
        authAdminRouterGroup.GET("categories/show/:id", admin.ShowCategories)
        authAdminRouterGroup.GET("categories/index", admin.IndexCategories)
        authAdminRouterGroup.PUT("categories/update/:id", admin.UpdateCategories)
        authAdminRouterGroup.DELETE("categories/delete/:id", admin.DeleteCategories)

        authAdminRouterGroup.POST("courses/store", admin.StoreCourses)
        authAdminRouterGroup.GET("courses/show/:id", admin.ShowCourses)
        authAdminRouterGroup.PUT("courses/update/:id", admin.UpdateCourses)
        authAdminRouterGroup.GET("courses/index", admin.IndexCourses)
        authAdminRouterGroup.DELETE("courses/delete/:id", admin.DeleteCourses)
    }

    r.Run(":8080")
}
代码已被折叠,点此展开
2年前 评论
代码已被折叠,点此展开

@1

2年前 评论
func CheckCoursesByName(name string) (code int) {}

你这个函数 select 之后就返回了一个 code?直接返回数据库拿到的数据不就完了?

2年前 评论
my38778570 (楼主) 2年前
don178 (作者) 2年前
my38778570 (楼主) 2年前
don178 (作者) 2年前

干嘛非要存 json 做一对多的关联不是更简单吗?

2年前 评论
my38778570 (楼主) 2年前

你定义一个切片,然后用 json.Unmarshal 解析到你这个切片里面不就完事了

2年前 评论
xingkong12138 (作者) 2年前
my38778570 (楼主) 2年前
DianWang

新定义一个 JSON 类型,拿到数据自动转出来

package types

import (
    "bytes"
    "database/sql/driver"
    "encoding/json"
    "errors"
    jsoniter "github.com/json-iterator/go"
)

type JSON []byte

func (j JSON) Value() (driver.Value, error) {
    if j.IsNull() {
        return nil, nil
    }
    return string(j), nil
}
func (j *JSON) Scan(value interface{}) error {
    if value == nil {
        *j = nil
        return nil
    }
    err := json.Unmarshal(*j, &value)
    if err != nil {
        return err
    }
    //s, ok := value.([]byte)
    //if !ok {
    //    return errors.New("Invalid Scan Source")
    //}
    //*j = append((*j)[:], s...)
    return nil
}
func (m JSON) MarshalJSON() ([]byte, error) {
    if m == nil {
        return []byte("null"), nil
    }
    return m, nil
}
func (m *JSON) UnmarshalJSON(data []byte) error {
    if m == nil {
        return errors.New("null point exception")
    }
    *m = append((*m)[:], data...)
    return nil
}

func (j JSON) IsNull() bool {
    return len(j) == 0 || string(j) == "null"
}
func (j JSON) Equals(j1 JSON) bool {
    return bytes.Equal([]byte(j), []byte(j1))
}

func StructToJSON(value interface{}) JSON {
    bts, _ := jsoniter.Marshal(value)
    return bts
}
2年前 评论
goStruct

看你代码用的是 gorm,实现下 Scan 和 Value 这两个方法


type User struct {
    gorm.Model
  Name string `gorm:"comment:'用户名'"`
    Profile Profile `gorm:"type:json;comment:'个人信息'"`
}


type Profile struct {
    Email string `json:"email"`
    PhoneNo string `json:"phoneNo"`
}


func (p Profile) Value() (driver.Value, error) {
    return json.Marshal(p
}


func (p Profile) Scan(input interface{}) error {
    return json.Unmarshal(input.([]byte), p)
}
2年前 评论
my38778570 (楼主) 2年前

这个是官方的一个 类型拓展库 。它替我们封装了好了一些常用数据库的类型,比如说 MySQL 的 json 类型和 PostgreSQL 的 json 类型,都可以使用其中的一个叫 JSON 的类型,来完成底层 gorm 到数据的数据处理。我们只需要在业务模型中使用即可。

比如说,直接放在你的这个结构体(模型 model)中定义字段,像这样:

Images    datatypes.JSON     `gorm:"type:json;default:null;" json:"images" label:"图片"`

然后你可以为你的结构体(模型 model)定义一个 GetImages() 的方法,将原来的 datatypes.JSON 解析到你自己想要的一个类型中,比如这样:

// 假如你想要的结构体是这样的
type Image struct {
  ID          int
  Content string
}

// 为你的模型写上获取方法
func (c *Courses) GetImages() []*Image {
    imgs := make([]*Image,0)
    jsonBytes._ := c.Images.MarshalJSON()
    json.Unmarshal(jsonBytes, &imgs)
    return imgs
}
2年前 评论