Protobuf - бинарный формат, схема в .proto; код генерируется (protoc --go_out). Меньше размер, быстрее парсинг; типизация и версионирование. В Go: сообщения как структуры с методами Marshal/Unmarshal; для gRPC - сгенерированные типы и клиент/сервер. JSON удобнее для отладки и API для браузеров; protobuf - для внутренних сервисов и потоков.
import "google.golang.org/protobuf/proto"
data, _ := proto.Marshal(msg)
proto.Unmarshal(data, &msg)