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

4
我们希望在golang中返回一个只有一个空列表/数组/切片属性的对象/结构体给客户端(浏览器)。 从go代码中,我们返回长度为0且容量为0的空切片,但是通过protobuf这个键被删除或设置为空值并被移除了。

protobuf代码

syntax = "proto3";
package version1;
message ToDo {
     int64 id = 1 ;
     string title = 2;
}
message ReadAllResponse{
     repeated   ToDo  toDos = 1 ;
}

Go语言代码:

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

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

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


你是直接从浏览器调用grpc服务(使用grpc-web或其他方式),还是调用grpc-gateway(https://github.com/grpc-ecosystem/grpc-gateway)? - erikbozic
我正在通过浏览器调用服务的http端点,并且后端通过grpc-gateway代理此请求。 - dev2
1个回答

6
grpc-gateway使用jsonpb序列化器将proto结构序列化为json时,您的数组字段会丢失。
幸运的是,在设置网关时,网关提供了一种配置jsonpb序列化器的方法:
mux := runtime.NewServeMux(runtime.WithMarshalerOption(runtime.MIMEWildcard, &runtime.JSONPb{ EmitDefaults:true}))

"&runtime.JSONPb{ EmitDefaults:true}选项应该可以满足您的需求。"

非常感谢,这帮了大忙。 - dev2
为了未来的问题参考...https://github.com/grpc-ecosystem/grpc-gateway/issues/233。https://jbrandhorst.com/post/gopherjs-client-grpc-server-4/ - dev2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接