为了账号安全,请及时绑定邮箱和手机立即绑定

如何接收要插入的 json

如何接收要插入的 json

Go
米琪卡哇伊 2022-07-25 10:19:22
我收到每个帖子的一些值,并且我有一个 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 表单并插入 mysqlpackage modelsimport (    "bytes"    "database/sql/driver"    "errors")type JSON []bytefunc (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中的功能很常见,这对很多人都有用
查看完整描述

3 回答

?
狐的传说

TA贡献1804条经验 获得超3个赞

你犯了两种错误

  1. 您的 json 解码无法正常工作,因为您的结构与您的 json 不匹配。Config被定义为一个数组,但是在你的json中你有一个对象而不是数组,并且在Dev属性Item中是一个int而不是一个字符串

  2. 您的模型可能没有很好地定义,因为您没有定义您加入的表。好吧,我从未见过具有这种定义的工作示例。我建议您将嵌套结构声明为独立结构。

这是一个完整的工作示例:

package main


import (

    "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)

    }

}


查看完整回答
反对 回复 2022-07-25
?
料青山看我应如是

TA贡献1772条经验 获得超7个赞

所有这些答案对我都不起作用,但这对每个人都有效


模型


// This is the max Thing you need

import "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"}]

      }

    ]

  }

}


查看完整回答
反对 回复 2022-07-25
?
慕雪6442864

TA贡献1812条经验 获得超5个赞

您可以像下面那样更改 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);"`

    }

}


查看完整回答
反对 回复 2022-07-25
  • 3 回答
  • 0 关注
  • 71 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信