Maison >développement back-end >Golang >« google.protobuf.Struct » est-il le choix optimal pour l'envoi de JSON dynamique via gRPC ?

« google.protobuf.Struct » est-il le choix optimal pour l'envoi de JSON dynamique via gRPC ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-11 13:55:11663parcourir

Is `google.protobuf.Struct` the Optimal Choice for Sending Dynamic JSON via gRPC?

"google/protobuf/struct.proto" est-il le meilleur moyen d'envoyer du JSON dynamique via GRPC ?

L'utilisation du type google.protobuf.Struct fournit une solution efficace pour transmettre des données JSON dynamiques sur GRPC. Considérez le fichier User.proto suivant :

syntax = "proto3";
package messages;
import "google/protobuf/struct.proto";

service UserService {
    rpc SendJson (SendJsonRequest) returns (SendJsonResponse) {}
}

message SendJsonRequest {
    string UserID = 1;
    google.protobuf.Struct Details = 2;
}

message SendJsonResponse {
    string Response = 1;
}

Solution d'Anuj :

Bien que fonctionnelle, cette approche est quelque peu alambiquée :

var item = &structpb.Struct{
    Fields: map[string]*structpb.Value{
        "name": &structpb.Value{
            Kind: &structpb.Value_StringValue{
                StringValue: "Anuj",
            },
        },
        "age": &structpb.Value{
            Kind: &structpb.Value_StringValue{
                StringValue: "Anuj",
            },
        },
    },
}

Solution de Luke :

Cette méthode est plus concise mais implique plusieurs conversions :

m := map[string]interface{}{
  "foo":"bar",
  "baz":123,
}
b, err := json.Marshal(m)
s := &structpb.Struct{}
err = protojson.Unmarshal(b, s)

Solution recommandée :

L'approche la plus simple et la plus efficace consiste à utiliser les fonctions intégrées fournies par le package structpb :

m := map[string]interface{}{
    "name": "Anuj",
    "age":  23,
}

details, err := structpb.NewStruct(m) // Check for errors as per documentation
if err != nil {
    panic(err)
}

userGetRequest := &pb.SendJsonRequest{
    UserID: "A123",
    Details: details,
}

N'oubliez pas de respecter les règles de conversion spécifiées dans la documentation structpb pour éviter les erreurs.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn