无法使用 protobuf 生成空数组/golang 代码片段

dev*_*ev2 4 go protocol-buffers grpc-gateway

我们想将一个具有一个属性的对象/结构作为 golang 中的空列表/数组/切片返回给客户端(浏览器)。从 go 代码我们返回 len=0 和 capacity=0 的空切片,但是通过 protobuf 这个键被删除或设置为 nil 并被删除。

protobuf 代码

syntax = "proto3";
package version1;
message ToDo {
     int64 id = 1 ;
     string title = 2;
}
message ReadAllResponse{
     repeated   ToDo  toDos = 1 ;
}
Run Code Online (Sandbox Code Playgroud)

高朗代码:

list := make([]*version1.ToDo, 0) //[]*version1.ToDo{}
output:= version1.ReadAllResponse{
        ToDos: list,
        Api:   "v1",
    }
Run Code Online (Sandbox Code Playgroud)

我得到了实际输出, {api: "v1"}但预期应该是{api: "v1",todos:[]}

请帮助/建议我们修复 protobuf 或 golang 语法。

eri*_*zic 6

grpc-gateway使用 jsonpb 序列化程序将 proto 结构序列化为 json时,您的数组字段会丢失。

幸运的是,网关在设置网关时公开了一种配置 jsonpb 序列化程序的方法:

mux := runtime.NewServeMux(runtime.WithMarshalerOption(runtime.MIMEWildcard, &runtime.JSONPb{ EmitDefaults:true}))
Run Code Online (Sandbox Code Playgroud)

&runtime.JSONPb{ EmitDefaults:true}选项应该做你想做的。