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/sqllib/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的嵌套结构体中。

回到顶部