提问者:小点点

在gRPC原型中将字符串字段声明为JSON是一种好方法吗?


因为在protobuf中,在某些场景中定义一个灵活的结构很麻烦。

例如:

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

事实上,我不希望服务的客户端同时传递a和other。然而,在protobuf中,我们不能将这两个字段放在其中一个,因为另一个是列表字段。因此,声明了上述消息后,当我们只传递a\u other字段时,客户端无法判断a字段实际上是0还是服务器没有传递。

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

message Foo {
   string data = 1;
}

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

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


共1个答案

匿名用户

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

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中的类型是已知的原型类型,当将原型消息转换为JSON时,它们以原生JSON形式表示。

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

但是,在“删除模式并切换到JSON”之前,您应该咨询处理动态内容的不同方法。