|编号 |标题 |已完成 |
|-|-|-|
| 1 |啊啊|假|,上面的函数返回
{"todos": [{"id": "1", "title": "aaa"}]}
但一旦我将 is_completed
更改为 true
,结果是正确的 {"todos ": [{"id": "1", "title": "aaa", "iscompleted": true}]}
,这是设计使然,也是为了提高效率。,bool
的“零”值是 false
– 因此,当使用 false
值初始化 protobuf
结构时,在使用标准库的 encoding/json
解组器时不需要显式声明该字段。在编码端,如果字段的 json 标记包含 omitempty
限定符,则标准库的 encoding/json
封送拆收器将删除任何零值 – 这就是您所看到的。如果
title
字符串字段是 ""
(即字符串的零值),您将看到相同的行为。,查看生成的代码(*.pb.go
),结构体的 bool
字段定义将如下所示:,因此 json:"...,omitempty"
指示 encoding/json
封送拆收器在使用这些标签进行封送期间省略任何零值。,如果您想覆盖此行为:,可以从生成的代码中删除 omitempty
指令(不推荐 – 因为需要在开发的生命周期中管理编辑)。但如果您必须这样做,请参阅此答案;如果使用
grpc-gateway
,请在运行时覆盖它,例如,或者,如果自己导出 json,则不使用标准库 (encoding/json
),而是使用此包中的 json
封送拆收器 "google.golang.org/protobuf/encoding/protojson"
:,如此答案中所述。,