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
Libérer: 2024-12-11 13:55:11
original
666 Les gens l'ont consulté

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;
}
Copier après la connexion

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",
            },
        },
    },
}
Copier après la connexion

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)
Copier après la connexion

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,
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal