在gRPCproto中将字符串字段声明为JSON是一种好方法吗



由于在某些场景中定义灵活的结构对protobuf中的一些人来说是一个小麻烦。

例如:

message Foo {
int a = 1;
repeated int a_other = 2;
}

事实上,我不希望服务的客户端同时传递aa_other。然而,在protobuf中,我们不能将这两个字段放在oneof中,因为a_other是一个列表字段。因此,通过声明上面的消息,当我们只传递a_other字段时,客户端无法判断a字段实际上是0还是未由服务器传递。

所以我想知道是否为Foo定义一个字符串字段,比如:

message Foo {
string data = 1;
}

并且服务器端和客户端都同意将CCD_ 8字段视为JSON。因此,服务器转储原始数据,客户端加载原始数据,从此他们过着幸福的生活。

但我的问题是,这样做是一种常见的做法吗?它的缺点是什么?(当然,这样就不用进行类型检查了(或者有更好的方法吗?

oneof中的重复字段通常由包装消息解决。在您的情况下:

message Foo {
oneof choose_one_a {
int a = 1;
AOtherMessage a_other = 2;
}
}
message AOtherMessage {
repeated int a_other = 1;
}

看来你可以很容易地停下来。

然而,如果你真的发现自己处于";这里我想要任意的JSON";在这种情况下,您可能希望考虑struct.protoValue,而不是普通字符串。Value可以保存任意的JSON值。如果要保存任意JSON对象(也称为映射(,请改用Structstruct.proto中的类型是protobuf已知的已知类型,当将protobuf消息转换为JSON时,它们以原生JSON形式表示。

message Foo {
google.protobuf.Value a = 1;
}

然而,在";丢弃模式并交换到JSON;您应该参考处理动态内容的不同方法。

相关内容

最新更新