为了账号安全,请及时绑定邮箱和手机立即绑定

从 Golang 中的 postgres jsonb 列访问值

从 Golang 中的 postgres jsonb 列访问值

Go
白板的微信 2022-10-24 09:41:21
我从 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            }        }    }}
查看完整描述

1 回答

?
米脂

TA贡献1836条经验 获得超3个赞

msg.Vars["a"]对于 a和b 您可以msg.Vars["b"]分别访问这些值。对于 d、f 和 g,您需要首先访问它们的父项,就像访问 a 和 b 一样。然后,您需要对该类型的map[string]interface{}访问结果进行类型断言,然后通过类型断言的结果访问所需的字段。


fmt.Println(msg.Vars["a"]) // access a

fmt.Println(msg.Vars["b"]) // access b


c := msg.Vars["c"].(map[string]interface{}) // access c and type-assert as map[string]interface{}

fmt.Println(c["d"]) // then access d

https://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


查看完整回答
反对 回复 2022-10-24
  • 1 回答
  • 0 关注
  • 82 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信