How to Handle JSON Columns in PostgreSQL from Go
PostgreSQL JSON columns are handled in Go by scanning the column into a json.RawMessage or a custom struct using the pgx driver. Use json.RawMessage to defer parsing or a struct to unmarshal directly into fields.
package main
import (
"context"
"encoding/json"
"fmt"
"log"
"github.com/jackc/pgx/v5/pgxpool"
)
type User struct {
ID int `json:"id"`
Name string `json:"name"`
}
func main() {
ctx := context.Background()
// Connect to database
pool, err := pgxpool.New(ctx, "postgres://user:pass@host:5432/db")
if err != nil {
log.Fatalf("unable to connect to database: %v", err)
}
defer pool.Close()
// Query JSON column into struct
var u User
err = pool.QueryRow(ctx, "SELECT data FROM users WHERE id = $1", 1).Scan(&u)
if err != nil {
log.Fatalf("error scanning into struct: %v", err)
}
fmt.Printf("User (struct): %+v\n", u)
// Or scan into json.RawMessage for manual parsing
var raw json.RawMessage
err = pool.QueryRow(ctx, "SELECT data FROM users WHERE id = $1", 1).Scan(&raw)
if err != nil {
log.Fatalf("error scanning into raw message: %v", err)
}
var u2 User
if err := json.Unmarshal(raw, &u2); err != nil {
log.Fatalf("error unmarshaling: %v", err)
}
fmt.Printf("User (raw): %+v\n", u2)
}