Menggunakan jenis google.protobuf.Struct menyediakan penyelesaian yang cekap untuk menghantar data JSON dinamik melalui GRPC. Pertimbangkan fail User.proto berikut:
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; }
Penyelesaian Anuj:
Walaupun berfungsi, pendekatan ini agak berbelit-belit:
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", }, }, }, }
Penyelesaian Luke:
Kaedah ini lebih ringkas tetapi melibatkan berbilang penukaran:
m := map[string]interface{}{ "foo":"bar", "baz":123, } b, err := json.Marshal(m) s := &structpb.Struct{} err = protojson.Unmarshal(b, s)
Penyelesaian Disyorkan:
Pendekatan paling mudah dan cekap ialah menggunakan fungsi terbina dalam yang disediakan oleh pakej 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, }
Ingat untuk mematuhi peraturan penukaran yang dinyatakan dalam dokumentasi structpb kepada elakkan kesilapan.
Atas ialah kandungan terperinci Adakah `google.protobuf.Struct` Pilihan Optimum untuk Menghantar JSON Dinamik melalui gRPC?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!