辞書のProtobufリスト
Aug 18 2020
.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;
}
回答
1 dmaixner Aug 18 2020 at 17:22
私が思いついたいくつかのアイデア:
- (すべての値型を事前に知っている場合)
oneof
値に使用することは可能であると思われます(https://developers.google.com/protocol-buffers/docs/proto3#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
。
オプションのフィールドを使用して、それらすべてをメッセージ定義の値として定義できます。次に、それらだけを設定し、実際に使用します。
ラッパー、または既知のタイプを使用できます。例
Value
:https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#google.protobuf.Value
編集
の場合、次のValue
ように使用できます。
map<string, google.protobuf.Value> dict = 1;
struct
(for_stackによって提案されているように)使用法はここで見ることができます:PythonディクトからProtobuf構造体をどのように作成しますか?