访问Golang中postgres-jsonb列中的值



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

{
"a": 123,
"b": "some str",
"c": {"d": 23},
"e": {"f":34, "g", 434}
}

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

EDIT:获取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
}
}
}
}

对于a和b,您可以分别执行msg.Vars["a"]msg.Vars["b"]来访问这些值。对于d、f和g,您需要首先访问它们的父级,就像访问a和b一样。然后,您需要键入assert,将该访问的结果断言为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

最新更新