首页 >后端开发 >Golang >`google.protobuf.Struct` 是通过 gRPC 发送动态 JSON 的最佳选择吗?

`google.protobuf.Struct` 是通过 gRPC 发送动态 JSON 的最佳选择吗?

Patricia Arquette
Patricia Arquette原创
2024-12-11 13:55:11661浏览

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

“google/protobuf/struct.proto”是通过 GRPC 发送动态 JSON 的最佳方式吗?

利用 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn