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!