【问题标题】:Does protobuf support json properly for nulls since null support is odd?由于 null 支持很奇怪,protobuf 是否正确支持 json?
【发布时间】: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


    【解决方案1】:

    对于下一个人(我使用我在 SO 上的帖子和答案作为我自己的个人知识库),我发现了这篇很棒的文章...

    https://itnext.io/protobuf-and-null-support-1908a15311b6

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-16
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-15
      • 1970-01-01
      相关资源
      最近更新 更多