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.

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)
}