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

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

Golang:將 json 字符串從 mysql db 解碼為 struct

Golang:將 json 字符串從 mysql db 解碼為 struct

Go
滄海一幻覺 2021-11-15 16:58:17
我試圖從我的數據庫中獲取信息,我的一個字段實際上是作為字符串存儲的 JSON,我想將它作為一個結構來獲取。這是我行的結構://there is json flag because I use it to get data from redis tootype InfoClip struct { ClipId             string `json:clipId` StreamUrl          string `json:streamUrl` StartTimeCode      int `json:startTimeCode` EndTimeCode        int `json:endTimeCode` CreatedAt          string `json:createdAt` Metas              string `json:metas` // here I get a string instead of a 'metas' struct SourceId           string `json:sourceId` ProviderName       string `json:providerName` ProviderReference  string `json:providerReference` PublicationStatus  string `json:publicationStatus` UserId             string `json:userId` Name               string `json:name` FacebookPage       string `json:facebookPage` TwitterHandle      string `json:twitterHandle` PermaLinkUrl       string `json:permalinkUrl` Logo               string `json:logo` Link               string `json:link`}這是我的metas結構:type metas struct { Title      string `json:title` Tags       []string `json:tags` categories []string `json:permalink`}這就是我試圖獲得這個領域的方式func decodeJsonSql (met string) (*metas, error) { m := metas{} if err := json.Unmarshal([]byte(met), &m); err != nil {    fmt.Printf("Error decode metas: ", err)    return nil, err } else {    return &m, err } } func CheckIdSql(mediaId string) (error){ datab, err := sql.Open("mysql", "tcp()") if err != nil {    fmt.Printf("[SQL ERROR] Cannot Open db => ", err)    return err}if err := datab.Ping(); err != nil {    fmt.Printf("[SQL ERROR] db connection => ", err)    return err}fmt.Printf("[SQL ONLINE] =>", datab)defer datab.Close()q := "SELECT c.id AS clipId, c.streamUrl, c.startTimecode,  c.endTimecode, c.createdAt, s.metas,... FROM clips WHERE c.id = ?"rows, err := datab.Query(q, mediaId)if err != nil || err == sql.ErrNoRows {    fmt.Printf("SQL Err: %s", err)    return err}但是這個過程相當繁重,肯定有更簡單的方法嗎?謝謝。
查看完整描述

1 回答

?
浮云間

TA貢獻1829條經驗 獲得超4個贊

你可以讓你的metas結構實現sql.Scanner接口


它應該是這樣的:


func (m *metas) Scan(src interface{}) error {

    strValue, ok := src.(string)


    if !ok {

        return fmt.Errorf("metas field must be a string, got %T instead", src)

    }


    return json.Unmarshal([]byte(strValue), m)

}

之后,您可以將其用作InfoClip字段并將其直接傳遞給Scan并刪除decodeJsonSql:


type InfoClip struct {

    // [...]

    Metas metas `json:metas`

    // [...]

}


q := "SELECT c.id AS clipId, c.streamUrl, c.startTimecode,  c.endTimecode, c.createdAt, s.metas,... FROM clips WHERE c.id = ?"

row := datab.QueryRow(q, mediaId)

clips := InfoClip{}

err := row.Scan(&clips.ClipId, &clips.StreamUrl, &clips.StartTimeCode, &clips.EndTimeCode, &clips.CreatedAt, &clips.Metas) // [...]

if err != nil {

    fmt.Printf("SQL Err: %s", err)

    return err

}

(順便說一句,你可以看到,我換成datab.Query與datab.QueryRow你期待只有一個結果)


查看完整回答
反對 回復 2021-11-15
  • 1 回答
  • 0 關注
  • 245 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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