从 Golang 中的 postgres jsonb 列访问值

我从 postgres 得到一个 jsonb 列,它的价值类似于


{

"a": 123,

"b": "some str",

"c": {"d": 23},

"e": {"f":34, "g", 434}

}

如何访问密钥 a、b、d、f、g?谢谢


编辑:获取 jsonb 列“vars”:


type Msg struct{

    Id int

    Vars map[string]interface{}

}

queryToGetD := "select id, vars from msg_table"

if rows, errRow := db.Query(queryToGetD); errRow != nil {

    return nil, fmt.Errorf("error while getting data \nquery %s \nerror %s", queryToGetD, err)

} else {

    func (){

        defer rows.Close()

        for rows.Next(){

            var msg Msg

            var vars string

            if err := rows.Scan(&msg.Id, &vars); err != nil{

                // handle error

                continue

            }else{

                if err := json.Unmarshal([]byte(vars), &msg.Vars); err != nil {

                    // handle error

                    continue

                }

                // Add msg to the needed slice

            }

        }

    }

}


白板的微信
浏览 111回答 1
1回答

米脂

msg.Vars["a"]对于 a和b 您可以msg.Vars["b"]分别访问这些值。对于 d、f 和 g,您需要首先访问它们的父项,就像访问 a 和 b 一样。然后,您需要对该类型的map[string]interface{}访问结果进行类型断言,然后通过类型断言的结果访问所需的字段。fmt.Println(msg.Vars["a"]) // access afmt.Println(msg.Vars["b"]) // access bc := msg.Vars["c"].(map[string]interface{}) // access c and type-assert as map[string]interface{}fmt.Println(c["d"]) // then access dhttps://go.dev/play/p/oZERUsL2EUY或者使用与 json 匹配的结构,然后您可以使用选择器表达式访问字段type Vars struct {    A int    `json:"a"`    B string `json:"b"`    C struct {        D int `json:"d"`    } `json:"c"`    E struct {        F int `json:"f"`        G int `json:"g"`    } `json:"e"`}// ...fmt.Println(msg.Vars.A)fmt.Println(msg.Vars.B)fmt.Println(msg.Vars.C.D)fmt.Println(msg.Vars.E.F)fmt.Println(msg.Vars.E.G)https://go.dev/play/p/6ur78SNB_bL
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go