支持 Proto3 中的多个模式

Support multiple schemas in Proto3

我正在创建一个允许 multiple/arbitrary 传入 json 对象中的数据的 proto3 架构。我想一次转换传入的 json 对象。

例如

{"key1":"value",
 "key2": {  //schema A}
 }

我还想在不同的请求中支持 key2 的模式 B。

{"key1":"value",
 "key2": {  //schema B}
 }

我尝试了几种不同的方法,例如 oneof 但是对于 oneof 它需要不同的键名,因为我使用的是相同的 key2,它对我不起作用这个案例。

这是架构。

message IncomingRequest {
string key1 = 1;
//google.protobuf.Any key2 = 2;  --> not working
    oneof message{
        A payload = 2; 
        B payload = 3; --> duplicate key
    } 
}

有人知道如何实现吗?

我能想到的两种方式:

每个请求的消息类型

如果您知道,根据请求(例如调用的 HTTP URL),如果它应该是模式 A 或 B,我建议为每个请求创建单独的消息类型。这可能会导致您必须定义更多的原型类型,但在您必须编写以使用有效负载的实际代码中使用起来会很简单。

结构类型

如果您真的want/have要重用相同的消息类型,您可以使用Struct proto type到encode/decode任何JSON结构。

message IncomingRequest {
    string key1 = 1;
    google.protobuf.Struct key2 = 2;
}

尽管从原型类型定义来看,它看起来不像您想要的那样,但 Protobuf decoders/encoders 将以特殊方式处理此类型,为您提供所需的行为。

这个选项的问题在于,你在原型中获得了灵活性,但在生成的代码中却失去了表现力,因为你必须做很多边缘案例检查,如果特定 value/type设置。