go kratos protobuf 接收动态JSON数据
前言
google.protobuf.Struct
是 Google Protocol Buffers
中的一种特殊类型,用于表示动态的键值对数据。它可以存储任意类型的数据,并提供了方便的方法来访问和操作这些数据。
Struct
类型通常用于在不事先知道数据结构的情况下传递和处理配置、参数或其他动态数据。
https://pkg.go.dev/google.golang.org/protobuf/types/known/structpb
代码示例
以下代码,引入了 google/protobuf/struct.proto
,该文件定义了 google.protobuf.Struct
类型。
在 UpdateBookRequest
消息中,字段 data
使用 google.protobuf.Struct
类型定义。
syntax = "proto3";
import "google/protobuf/struct.proto";
message UpdateBookRequest {
google.protobuf.Struct data = 1;
}
Kratos
框架,Service
实现方法中,接收 UpdateBookRequest
,这时它的 pb
文件中定义为 Data *structpb.Struct protobuf:"bytes,1,opt,name=data,proto3" json:"data"
func (s *myService) UpdateBook(ctx context.Context, req *api.UpdateBookRequest) (*api.UpdateBookReply, error) {
……
// 接收 data bytes 数据,转化为 json
data, err := json.Marshal(req.Data)
if err != nil {
panic(err)
}
……
// 将 json 数据,转化为结构体
scene := &structpb.Struct{}
// 这里有一个非 null 判断,其中 app.Data 为数据库中查询
if !bytes.Equal(app.Data, []byte("null")) {
err = json.Unmarshal(app.Data, scene)
if err != nil {
panic(err)
}
}
……
}