go proto3 生成的文件,微服务接口会过滤掉零值字段,这个有什么好的解决方式吗?
比如我定义了 name age 两个字段,如果 age 是 0 ,name 返回的时候只有 name 字段,这样不太友好。
1
tairan2006 2022-08-03 13:23:55 +08:00 1
ls *.pb.go | xargs -n1 -IX bash -c 'sed s/,omitempty// X > X.tmp && mv X{.tmp,}'
|
2
tairan2006 2022-08-03 13:26:39 +08:00 2
或者:
import "google.golang.org/protobuf/encoding/protojson" m := protojson.MarshalOptions{EmitUnpopulated: true} resp, err := m.Marshal(w) |
3
timethinker 2022-08-03 13:28:57 +08:00 1
0 是作为默认值的,可以减少序列化以后的体积大小,当你反序列化以后,创建出来的数据结构里面的 age 字段在没有设置的时候,也是 0 值,所以从结果上来看是没有什么影响的。
|
4
dcoder 2022-08-03 13:41:14 +08:00 1
protocol buffer 其实表现力很弱, 自己要额外做很多工作才能用舒服了
|
5
570956418 OP @timethinker 我这边用 api 请求 rpc server 出来的时候零值的字段是不存在的,我在 server 端打印的时候就发现零值字段没有,是我哪里写的不对吗
|
6
570956418 OP @tairan2006 第一个我试过不行, 我再试试 可能我哪里写错了,谢谢
|
7
tairan2006 2022-08-03 14:13:14 +08:00
@570956418 你直接用 ide 把所有,omitempty 删掉也行
|
8
twistedmeadows 2022-08-03 14:18:00 +08:00
如果我没理解错,这是 protobuffer 自己的特性,任何语言版本的 protobuffer 都会这样省略 0 值来减少传输。
可能需要关注你 client 端为什么反序列化出来没有这个字段。按理说,它反序列化时也会把零值自动填回来,该有的字段还是有的。 所以需要你补充解释「 api 请求 rpc server 出来的时候零值的字段是不存在的」 |
9
570956418 OP @tairan2006 我去掉了,但是零值的字段还是没有, 不知道怎么回事
|
10
kalista 2022-08-03 14:31:17 +08:00
没有太理解 op 的意思,猜测是想 print 时候有零值字段?那应该从打印函数着手,我提供一个序列化为 json 的做法
|
11
kalista 2022-08-03 14:31:33 +08:00
```go
var data bytes.Buffer var jsonMarshal = &jsonpb.Marshaler{ EnumsAsInts: false, EmitDefaults: true, Indent: "", OrigName: false, AnyResolver: nil, } err := jsonMarshal.Marshal(&data, pb) if err != nil { return err } ``` |
12
570956418 OP @tairan2006 好了,谢谢,我在 server 端去掉的,应该在 client 端去掉。是我没理解透彻,谢谢指导
|
13
570956418 OP @twistedmeadows 好了,谢谢,我在 server 端去掉的,应该在 client 端去掉。是我没理解透彻,谢谢指导
|
15
czyt 2022-08-03 21:21:27 +08:00
|