Golang中如何将PostgreSQL的JSONB查询响应字符串解析到嵌套结构体
Golang中如何将PostgreSQL的JSONB查询响应字符串解析到嵌套结构体 https://stackoverflow.com/questions/56558802/unmarshaling-postgresql-jsonb-query-response-string-into-golang-nested-struct
1 回复
更多关于Golang中如何将PostgreSQL的JSONB查询响应字符串解析到嵌套结构体的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Golang中解析PostgreSQL的JSONB字段到嵌套结构体,可以使用标准库的encoding/json包。以下是完整的解决方案:
首先定义与JSON结构对应的嵌套结构体:
type Address struct {
Street string `json:"street"`
City string `json:"city"`
Country string `json:"country"`
}
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Address Address `json:"address"`
}
使用database/sql和lib/pq驱动查询并解析:
import (
"database/sql"
"encoding/json"
_ "github.com/lib/pq"
)
func main() {
db, err := sql.Open("postgres", "postgres://user:pass@localhost/dbname")
if err != nil {
panic(err)
}
defer db.Close()
var jsonbData []byte
err = db.QueryRow("SELECT jsonb_column FROM table_name WHERE id = $1", 1).Scan(&jsonbData)
if err != nil {
panic(err)
}
var user User
err = json.Unmarshal(jsonbData, &user)
if err != nil {
panic(err)
}
fmt.Printf("User: %+v\n", user)
}
如果JSONB字段包含数组,可以使用切片:
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Addresses []Address `json:"addresses"`
}
var users []User
err = json.Unmarshal(jsonbData, &users)
对于包含动态字段的JSONB,可以使用map[string]interface{}:
var data map[string]interface{}
err = json.Unmarshal(jsonbData, &data)
使用sql.NullString处理可能为null的JSONB字段:
var jsonbData sql.NullString
err = db.QueryRow("SELECT jsonb_column FROM table_name WHERE id = $1", 1).Scan(&jsonbData)
if err != nil {
panic(err)
}
if jsonbData.Valid {
var user User
err = json.Unmarshal([]byte(jsonbData.String), &user)
if err != nil {
panic(err)
}
}
这种方法可以直接将PostgreSQL的JSONB查询结果映射到Golang的嵌套结构体中。

