第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

將 json 數(shù)組解組為 struct 數(shù)組

將 json 數(shù)組解組為 struct 數(shù)組

Go
守著星空守著你 2022-07-11 10:30:26
我正在使用Mysql 8. 我還利用99designs/gqlgen基于 GraphQL 模式自動(dòng)生成結(jié)構(gòu)。在掃描 MySql 響應(yīng)時(shí),我將重復(fù)使用相同的結(jié)構(gòu)。最重要的是,在制作原型時(shí),我想在我的表中添加一些 JSON。所以結(jié)構(gòu)是:type CustomizedItemInput struct {    Sku              string                 `json:"sku"`    Name             string                 `json:"name"`    Skus             []*CustomizedComponent `json:"skus"`    ...由于存儲(chǔ)(提供Value())更簡(jiǎn)單,我成功地將 Skus 作為頂級(jí) JSON 存儲(chǔ)到數(shù)據(jù)庫中。看起來像這樣:[{"sku": "123", "position": "LEFT"}, {"sku": "456", "position": "RIGHT"}]現(xiàn)在,我如何將這個(gè)值從 DB 中取出并返回到結(jié)構(gòu)內(nèi)的指針數(shù)組中,而不需要太多麻煩?當(dāng)然,理想情況下,它應(yīng)該在不更改底層結(jié)構(gòu)的情況下完成,因?yàn)樗亲詣?dòng)生成的。更新: 添加調(diào)試信息。我需要將 DB 行讀入 CustomizedItemView,它基本上反映了上面的 CustomizedItemInput:type CustomizedItemView struct {    Sku              string                     `json:"sku"`    Name             string                     `json:"name"`    Skus             []*CustomizedComponentView `json:"skus"`    ...當(dāng)然,當(dāng)我說“沒有喧囂”時(shí),我的意思是將 DB 行無縫地提取到結(jié)構(gòu)中。我可以添加map[string]interface{}{}所有的花里胡哨并獲得價(jià)值。但我想讓它整潔,比如:    var storedCustItem = model.CustomizedItemView{}    err := udb.Get(&storedCustItem, database.SelectCustomizationQuery, userID, custItem.Sku, createdAt)我得到的錯(cuò)誤是:2020/10/10 20:38:24 sql: Scan error on column index 8, name "skus": unsupported Scan, storing driver.Value type []uint8 into type *[]*model.CustomizedComponentView(8 因?yàn)槲覟槭纠齽h除了一些字段)。主要問題是我無法Scan()為未命名的類型創(chuàng)建。我創(chuàng)建了包裝器,Value()因?yàn)槲业牟迦敫敿?xì),并且我使用其中的包裝器類型進(jìn)行類型轉(zhuǎn)換:type CustomizedComponentsIn []*CustomizedComponent...func (customizedComponents CustomizedComponentsIn) Value() (driver.Value, error)...tx.MustExec(database.SaveCustomizationCommand,        custItem.Sku,        custItem.Name,        model.CustomizedComponentsIn(custItem.Skus)...,這對(duì)于插入來說是可以的,因?yàn)闀?huì)有一些不屬于輸入結(jié)構(gòu)的值。但我希望至少能將掃描到的值自動(dòng)掃描到 View 結(jié)構(gòu)中。
查看完整描述

1 回答

?
哈士奇WWW

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超6個(gè)贊

如果您可以更改Skus字段的類型,常見的方法是聲明一個(gè)實(shí)現(xiàn)sql.Scanner和driver.Valuer接口的切片類型并使用它而不是未命名的[]*CustomizedComponent類型。


例如:


type CustomizedItemInput struct {

    Sku  string                   `json:"sku"`

    Name string                   `json:"name"`

    Skus CustomizedComponentSlice `json:"skus"`

    // ...

}


type CustomizedComponentSlice []*CustomizedComponent


// Value implements driver.Valuer interface.

func (s CustomizedComponentSlice) Value() (driver.Value, error) {

    return json.Marshal(s)

}


// Scan implements sql.Scanner interface.

func (s *CustomizedComponentSlice) Scan(src interface{}) error {

    var data []byte

    switch v := src.(type) {

    case string:

        data = []byte(v)

    case []byte:

        data = v

    default:

        return nil

    }

    return json.Unmarshal(data, s)

}

如果您無法更改Skus字段類型,則必須在掃描期間顯式轉(zhuǎn)換字段。


例如,給定上述命名的切片類型,您可以執(zhí)行以下操作:


v := new(CustomizedItemView)

row := db.QueryRow("SELECT sku, name, skus FROM customized_item_view WHERE sku = ? LIMIT 1", sku)

err := row.Scan(

    &v.Sku,

    &v.Name,

    // do the conversion here, and any other place where you're scanning Skus... 

    (*CustomizedComponentSlice)(&v.Skus),

)

if err != nil {

   return err

}

fmt.Println(v.Skus) // result


查看完整回答
反對(duì) 回復(fù) 2022-07-11
  • 1 回答
  • 0 關(guān)注
  • 114 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)