【发布时间】:2023-03-21 20:45:01
【问题描述】:
我正在阅读 protobuf 上的这篇文章,因为我使用 grpc json 来替换现有客户在 grpc 上使用我们的 json ...https://github.com/protocolbuffers/protobuf/issues/1451
builder.setName(null) 不受支持,因为有线格式“不”发送 null 值。如果是这种情况,我该如何做这些情况的json等效
- “名称”:1234
- "name": 0 //{defaultValue=0 for int} 在线上
- “名称”:空
- {名称不存在}
对我来说,在 protobuf 中调用 setName 的“不”会 == {name not exist} 二进制格式,而是二进制格式的 name=0。在这种情况下如何在 protobuf 中指定,以便在切换到 protobuf 的同时保持与 json 中现有客户的兼容性?
特别是对于 Java,我们需要一个 setAge() 方法,如果我不调用它,该字段将不存在。如果我调用 setAge(null),它将封送“age”:null。如果我调用 setAge(0),它将编组“age”:0(默认值)。如果我调用 setAge(56) 非默认值,它会编组 "age" : 56
然后我们想要 protobuf 做同样的事情。当然,有线格式可能必须添加其他字段。这很好,因为默认值不会被编组到线路上,所以无法区分空值和默认值:(。我们可以为开发人员提供 KISS 线路上的额外数据。
是否有一个原型模式,我们也可以使用它来使用简单的 setAge(null) 方法来编组“name”:null。
这是我现在正在尝试做的事情
message SomeMessage {
string clientId = 1;
oneof optional_result { // "optional_" prefix here just serves as an indicator, not keyword in proto2
bool isAccepted = 5;
}
}
然后,我看到一个方法 getIsAccepted() 返回“布尔值”。我没有看到 hasIsAccepted() 的字段。我不确定如何定义架构以映射到这个“单个”json 字段。
哈哈,因为我刚刚在这里添加了 grpc json 到我们的平台,不确定 protobuf 是否可以支持所有 json 用例......
https://github.com/deanhiller/webpieces/tree/master/webserver-plugins/plugin-grpc-json
商业案例:一些客户问我们如果接受保险,则希望为 true,如果不接受,则为 false,如果不存在,则为 null。我们在这里有三个用例。
谢谢, 院长
【问题讨论】:
标签: protocol-buffers grpc grpc-java protobuf-java