如何接收要插入的 json

我收到每个帖子的一些值,并且我有一个 json 类型字段,但它为空,如果我输入普通文本,它可以工作,我没有在字段中看到错误


模型已更新,以便它接收字段并允许在 mysql 中插入


POSTman


    {

      "Code":"1234",//it works

      "Desc":"desc",//it works

      "Config":{"link":"https://stackoverflow.com/"  }, //not works

      "Dev":[ {"item":1},{"item":2}]//not works

       

    }

    

    

    type User struct {

        gorm.Model

        Code   string `gorm:"type:varchar(100);unique_index"`

        Desc   string `gorm:"type:varchar(255);"`

        Config JSON   `json:"currencies" gorm:"type:varchar(255);"`

        Dev   JSON     `json:"currencies" gorm:"type:varchar(255);"`

    }

    

    func CreateUser(c *gin.Context) {

         var usuario models.User

    var bodyBytes []byte

    if c.Request.Body != nil {

        bodyBytes, _ = ioutil.ReadAll(c.Request.Body)

    }

    data := bytes.NewBuffer(bodyBytes)

    fmt.Println(data.Config)


         c.BindJSON(&usuario)

         db.DB.Create(&usuario)

        c.JSON(200, usuario)

    }

模型更新。接收带有 json 字段的 post 表单并插入 mysql


package models


import (

    "bytes"

    "database/sql/driver"

    "errors"

)


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

    }

    s, ok := value.([]byte)

    if !ok {

        errors.New("error")

    }

    *j = append((*j)[0:0], 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("error")

    }

    *m = append((*m)[0:0], 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))

}

非常感谢所有帮助过我的人,我认为接收json并将其保存在mysql中的功能很常见,这对很多人都有用


米琪卡哇伊
浏览 89回答 3
3回答

狐的传说

你犯了两种错误您的 json 解码无法正常工作,因为您的结构与您的 json 不匹配。Config被定义为一个数组,但是在你的json中你有一个对象而不是数组,并且在Dev属性Item中是一个int而不是一个字符串您的模型可能没有很好地定义,因为您没有定义您加入的表。好吧,我从未见过具有这种定义的工作示例。我建议您将嵌套结构声明为独立结构。这是一个完整的工作示例:package mainimport (    "database/sql"    "encoding/json"    "fmt"    "gorm.io/driver/sqlite"    "gorm.io/gorm")const data = `{    "Code":"1234",    "Desc":"desc",    "Config":{"link":"https://stackoverflow.com/"  },    "Dev":[ {"item":1},{"item":2}] }`type Config struct {    Id     int    `gorm:"primaryKey"`    Link   string `json:"link"`    Title  string    UserId int}type Item struct {    Id     int `gorm:"primaryKey"`    Item   int `json:"item"`    UserId int}type User struct {    Id     int `gorm:"primaryKey"`    Code   string    Desc   string    Config Config `gorm:"foreignkey:UserId"`    Dev    []Item `gorm:"foreignkey:UserId"`}func initDb(url string) (*gorm.DB, *sql.DB, error) {    connexion := sqlite.Open(url)    db, err := gorm.Open(connexion, &gorm.Config{})    if err != nil {        return nil, nil, err    }    sql, err := db.DB()    if err != nil {        return nil, nil, err    }    err = db.AutoMigrate(&User{})    if err != nil {        return nil, nil, err    }    err = db.AutoMigrate(&Item{})    if err != nil {        return nil, nil, err    }    err = db.AutoMigrate(&Config{})    if err != nil {        return nil, nil, err    }    return db, sql, nil}func run() error {    db, sql, err := initDb("file::memory:?cache=shared")    if err != nil {        return err    }    defer sql.Close()    var user User    err = json.Unmarshal([]byte(data), &user)    fmt.Printf("%#v\n", user)    err = db.Create(&user).Error    if err != nil {        return err    }    var loaded User    db.Preload("Config").Preload("Dev").First(&loaded)    fmt.Printf("%#v\n", loaded)    return nil}func main() {    if err := run(); err != nil {        fmt.Println("failed", err)    }}

料青山看我应如是

所有这些答案对我都不起作用,但这对每个人都有效模型// This is the max Thing you needimport "gorm.io/datatypes"import "encoding/json"type CMSGenericModel struct {    gorm.Model    //... Other Posts    ExtraData   datatypes.JSON `json:"data"`}在处理函数中type CmsReqBody struct {    // ============= RAW ========    Data        json.RawMessage `json:"data"`    // other props...}cmsBodyRecord := new(models.CMSGenericModel)cmsBodyPayload := new(CmsReqBody)if err := c.BodyParser(cmsBodyPayload); err != nil {    return c.Status(503).SendString(err.Error())}cmsBodyRecord.ExtraData = datatypes.JSON(cmsBodyPayload.Data)我的样本数据{  "title": "Blog Post 1",  "subtitle": "first",  "description": "Updated",  "type": "blog",  "isActive": true,  "uuid": "new",  "data": {    "complex1": ["kkkk", "yyyy"],    "complex2": [      {        "name": "sourav"      },      {        "name": "yahooo"      },      {        "yahoo": "name",        "kjk": ["abbsb", {"data": "abcd"}]      }    ]  }}

慕雪6442864

您可以像下面那样更改 JSON,或者您可以像下面那样更改 Struct(我更喜欢 struct 方法){"Code": "1234","Desc": "desc","Config": {   "Link": "https://stackoverflow.com/"},"Dev": [   {      "Item": 1   },   {      "Item": 2   } ]}结构:type User struct {    gorm.Model    Code   string `json:"Code" gorm:"type:varchar(100);unique_index"`    Desc   string `json:"Desc" gorm:"type:varchar(255);"`    Config []struct {        Link  string `json:"link" gorm:"type:varchar(255);"`        Title string `json:"title" gorm:"type:varchar(255);"`    }    Dev []struct {        Item string `json:"item" gorm:"type:varchar(255);"`    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go