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

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

使用 redigo 將 json 部分從 Redis 轉換為 Go 結構

使用 redigo 將 json 部分從 Redis 轉換為 Go 結構

Go
慕田峪9158850 2021-10-04 16:55:31
我有一個由瀏覽器發(fā)布的 json。這是一個散列var id int64 = 123 并且,比如說,三個字段,如下所示:myJson := `{     "a":"{'x1':'apple','x2':'orange'}",     "b":"{'y1':345678,'y2':32456}",     "c":"['alpha@example1.com', 'beta@example2.com']"}`然后使用redigo和命令將其存儲在 Redis 中:HMSET id:123 a "{'x1':'apple','x2':'orange'}" b "{'y1':345678,'y2':32456}" c "['alpha@example1.com', 'beta@example2.com']"現(xiàn)在,我想在 Go 中使用這樣的模型type Model struct {    A string `json:"a"`    B string `json:"b"`    C string `json:"c"` // Unknown length of map at runtime}1.我調(diào)用Redisv, _ := redis.Values(c.Do("HGETALL", "id:123"))我通過 redis-cli 看到正確存儲的值,但將v回復轉換為模型結構不起作用:var model Modelif err := redis.ScanStruct(v, &model); err != nil {    panic(err)}fmt.Printf("c %#v\n", model.C) => empty []我想訪問單個 k:v 對,例如:B.y2 = 32456C[0] = "alpha@example1.com"2.我還想將 json.Marshal myJson作為 {a}、{a,b}、{a,c}、{a,b,c} 等的組合返回瀏覽器。我不確定如何將各種 a、b、c 字段組合組合成一個以進行編組。任何幫助,將不勝感激。
查看完整描述

3 回答

?
MMMHUHU

TA貢獻1834條經(jīng)驗 獲得超8個贊

首先,您應該使用redis而不是json標簽來標記您的字段名稱,這就是 redigo 用于 ScanStruct() 的內(nèi)容。例如


type Model struct {

    A string `redis:"a"`

    B string `redis:"b"`

    C string `redis:"c"` // Unknown length of map at runtime

}

其次,您的成員是字符串,因此您不能讓個人成員訪問他們的內(nèi)容,而且我認為您無法使用 redigo 將其自動化。


作為變通方法,您可以使用某種擴展字符串的類型,并使用訪問方法將 json 延遲解析為底層 dict,然后返回值。像這樣的東西(沒有測試就寫,只是一般的想法,我不確定它會起作用但值得一試):


type MyString string


func (s MyString)Get(key string) (interface{}, error) {

   var m map[string]interface{}


   if err := json.Unmarshal([]byte(s), &m); err != nil {

       return nil, err

   } 


   return m[key], nil


}

它也不是很有效,因為它每次都會再次解析 json。就我個人而言,我會將整個模型事物包裝在一個結構中,該結構在從 redigo 反序列化的同時在幕后執(zhí)行所有邏輯。


查看完整回答
反對 回復 2021-10-04
?
搖曳的薔薇

TA貢獻1793條經(jīng)驗 獲得超6個贊

查看RedisLabs 的 ReJSON模塊。


我在這里為它創(chuàng)建了一個簡單的 go-client,它可以與 Redigo 一起使用。


type Model struct {

    A string `redis:"a" json:"a"`

    B string `redis:"b" json:"b"`

    C string `redis:"c" json:"c"`

}

要讀回它,請使用JSON.GET命令,


v, err := redis.Bytes(rejson.JSONGet(conn, "id:123", ""))

if err != nil {

    return

}


m := new(Model)

err = json.Unmarshal(v, m)

if err != nil {

    return

}



查看完整回答
反對 回復 2021-10-04
?
眼眸繁星

TA貢獻1873條經(jīng)驗 獲得超9個贊

type Model struct {

    A string `redis:"a" json:"a"`

    B string `redis:"b" json:"b"`

    C string `redis:"c" json:"c"`

}

您可以同時使用redis標簽和json標簽。

ScanStruct 應該可以正常工作,它使用redis標簽。


m := Model

v, err := redis.Values(c.Do("HGETALL", key))

err = redis.ScanStruct(v, &m)


查看完整回答
反對 回復 2021-10-04
  • 3 回答
  • 0 關注
  • 307 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號