0

我正在创建一个允许传入 jsonObject 中的多个/任意数据的 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
    } 
}

任何人都知道如何实现这一目标?

4

1 回答 1

1

我能想到的两种方法:

每个请求的消息类型

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

结构类型

如果您真的想要/必须重用相同的消息类型,您可以使用Struct 原型类型来编码/解码任何 JSON 结构。

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

尽管从原型类型定义来看,它看起来不像你想要的那样,Protobuf 解码器/编码器会以一种特殊的方式处理这种类型,从而为你提供想要的行为。

这个选项的问题是你在原型中获得了灵活性,你在生成的代码中失去了表现力,因为如果设置了特定的值/类型,你必须做很多边缘情况检查。

于 2019-08-23T05:02:29.077 回答