Если нужно преобразовывать сложные структуры по какой-то особой логике, то возможно имеет смысл использовать свой метод маршалинга. Вот небольшой грубый пример, но в целом думаю идею сможет донести верно:
type Person struct {
Id int
Name string
}
func (p Person) MarshalJSON() ([]byte, error) {
// Your custom logic
return []byte(`{"name": "` + p.Name + `"}`), nil
}
func main() {
user := Person{Id: 1, Name: "Mr.Incognito"}
json.NewEncoder(os.Stdout).Encode(user)
// Вместо всей структуры выведет только {"name":"Mr.Incognito"}
}
Попробовать в сэндбоксе:
https://play.golang.org/p/SyVWaDtBR9