首頁 >後端開發 >Golang >`google.protobuf.Struct` 是透過 gRPC 發送動態 JSON 的最佳選擇嗎?

`google.protobuf.Struct` 是透過 gRPC 發送動態 JSON 的最佳選擇嗎?

Patricia Arquette
Patricia Arquette原創
2024-12-11 13:55:11671瀏覽

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)

推薦方案:

推薦方案:
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提供的內建函數package:請記得遵守 structpb 文件中指定的轉換規則,以避免錯誤。

以上是`google.protobuf.Struct` 是透過 gRPC 發送動態 JSON 的最佳選擇嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn