问题描述
我正在尝试在.proto中定义词典列表
我发现的所有示例都提供了带有单个键,值对的字典:
message Pair {
string key = 1;
string value = 2;
}
message Dictionary {
repeated Pair pairs = 1;
}
或类似的东西
message Dictionary {
message Pair {
map<string,string> values = 1;
}
repeated Pair pairs = 1;
}
但是我将如何处理更大的混合类型字典?
{
'k1': 1,'k2': 2,'k3': 'three','k4': [1,2,3]
}
为了进一步使事情复杂化,一旦定义了混合值字典,我需要创建一条消息,这些消息是这些词典的列表。我认为这和创建另一个嵌套了字典的重复消息一样容易:
message DictList {
repeated Dictionary dlist = 1;
}
解决方法
我想到的一些想法:
- (如果您预先知道所有值类型)似乎可以使用
HttpContext.SignInAsync
作为值(https://developers.google.com/protocol-buffers/docs/proto3#oneof)。这样可以解决问题,例如
oneof
虽然您不能在message Value {
oneof oneof_values {
string svalue = 1;
int ivalue = 2;
...
}
}
message Pair {
string key = 1;
Value value = 2;
}
message Dictionary {
repeated Pair pairs = 1;
}
内使用map
或repeated
。
-
您可以使用可选字段并将它们全部定义为消息定义中的值。然后仅设置您实际使用的那些。
-
您可以使用包装器或已知类型,例如
oneof
:https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#google.protobuf.Value
编辑
对于Value
,可以这样使用:
Value
- 使用
map<string,google.protobuf.Value> dict = 1;
(如for_stack所建议),可以在此处看到:How do you create a Protobuf Struct from a Python Dict?