将Jason反序列化为ProtoBuffer消息时,空值设置为默认值

问题描述

我正在使用ProtoBuffer 3,并且有一条消息由多个字段组成,其中一些是其他消息,其中包含一些(或所有)可为空的值。

例如:

message MainMessage {
   google.protobuf.StringValue title = 1;
   NotNullable sub1 = 2;
   Nullable sub2 = 3;
   NotNullable sub3 = 4;
}

message NotNullable {
    int64 id = 1;
    string value = 2;
}

message Nullable {
    google.protobuf.Int64Value id = 1;
    google.protobuf.Int64Value value = 2;
}

我正在收到儿子的消息,我想使用以下代码反序列化它:

String json = "{\"title\":{\"value\":\"A nice title\"},\"sub1\":{\"id\":{\"value\":1}}}";
MainMessage.Builder message = MainMessage.newBuilder();
JsonFormat.parser().merge(json,message);

在要获取的对象上方运行代码后,包含所有字段(即使sub2sub3不在JSON中),其中所有缺失的数据都将初始化为认值

例如,以下代码将返回true:

assertTrue(message.getSub2().getId().isInitialized())
assertTrue(message.getSub3().isInitialized())

我检查了文档,但找不到一种方法来告诉解析器不要设置这些字段-有这样的选择吗?

解决方法

这篇文章似乎解决了这个问题:https://itnext.io/protobuf-and-null-support-1908a15311b6

我的实现方式如下(对名称的混淆,很抱歉-我想保留原始名称):

message MainMessage {
   google.protobuf.StringValue title = 1;
   NotNullable sub1 = 2;
   Nullable sub2 = 3;
   NotNullable sub3 = 4;
}

message NotNullable {
    int64 id = 1;
    string value = 2;
}

message Nullable {
    google.protobuf.Int64Value id = 1;
    google.protobuf.Int64Value value = 2;
}

message AllowNullable {
    oneof kind {
       google.protobuf.NullValue null = 1;
       Nullable value = 2;
}

现在所需要做的就是在调用值以检查其是否为空之前使用has方法

例如:

if(message.getSub3().hasValue()) {
   // do something...
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...