JsonFormat.printer().print() 如何工作?

kbe*_*nda 5 java json protocol-buffers

我有一个非常简单的原型:

message ChargeCardResponse
{
    bool success = 1;
}
Run Code Online (Sandbox Code Playgroud)

当我尝试将其解析为 String 时,我从 JsonFormat.printer().print() 得到一个非常奇怪的输出,这取决于成功值。

ChargeCardResponse.Builder builder = ChargeCardResponse.newBuilder();
System.out.println(JsonFormat.printer().print(builder.setSuccess(true).build()));
Run Code Online (Sandbox Code Playgroud)

输出:{“成功”:真}

ChargeCardResponse.Builder builder2 = ChargeCardResponse.newBuilder();
System.out.println(JsonFormat.printer().print(builder2.setSuccess(false).build()));
Run Code Online (Sandbox Code Playgroud)

输出: {}

因此,如果我为具有成功属性的打印机提供 false 值,则无法生成 JSON 格式。我究竟做错了什么?有谁能证实一下吗?

小智 6

问题是将成功设置为“false”相当于保留默认的“false”值不变。

JsonPrinter 会忽略默认的 proto 值,除非它关闭了该选项:

https://developers.google.com/protocol-buffers/docs/reference/java/com/google/protobuf/util/JsonFormat.Printer#includeDefaultValueFields--

这应该有效,我认为:

ChargeCardResponse.Builder builder2 = ChargeCardResponse.newBuilder();
System.out.println(JsonFormat.printer().includingDefaultValueFields().print(builder2.setSuccess(false).build()));
Run Code Online (Sandbox Code Playgroud)