https://play.golang.com/p/BPWVd0WAfqR

package main

import (
	"encoding/json"
	"fmt"
)

var bodyA = []byte(`{ 
  "type": "A",
  "data": { "name": "Johnny" }
}`)

var bodyB = []byte(`{ 
  "type": "B",
  "data": { "nickname": "J." }
}`)

type TypeA struct {
	Name string `json:"name"`
}

type TypeB struct {
	Nickname string `json:"nickname"`
}

func main() {
	req := struct {
		Type string `json:"type"`
		Data any    `json:"data"`
	}{}

	err := json.Unmarshal(bodyA, &req) // bodyB
	if err != nil {
		panic(err)
	}

	switch req.Type {
	case "A":
		req.Data = new(TypeA)
	case "B":
		req.Data = new(TypeB)
	}

	err = json.Unmarshal(bodyA, &req) // bodyB
	if err != nil {
		panic(err)
	}

	message, _ := json.Marshal(&req)
	fmt.Println(string(message))
}