利用 google.protobuf.Struct 类型提供了一种有效的解决方案用于通过 GRPC 传输动态 JSON 数据。考虑以下 User.proto 文件:
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; }
Anuj 的解决方案:
虽然有效,但这种方法有点复杂:
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", }, }, }, }
卢克的解决方案:
此方法比较简洁,但涉及多次转换:
m := map[string]interface{}{ "foo":"bar", "baz":123, } b, err := json.Marshal(m) s := &structpb.Struct{} err = protojson.Unmarshal(b, s)
推荐方案:
最直接高效方法是利用 structpb 提供的内置函数package:
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, }
请记住遵守 structpb 文档中指定的转换规则,以避免错误。
以上是`google.protobuf.Struct` 是通过 gRPC 发送动态 JSON 的最佳选择吗?的详细内容。更多信息请关注PHP中文网其他相关文章!