亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何接收要插入的 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條經驗 獲得超8個贊

所有這些答案對我都不起作用,但這對每個人都有效


模型


// 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 關注
  • 110 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號