支持 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设置。
我正在创建一个允许 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设置。