辞書の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

私が思いついたいくつかのアイデア:

  1. (すべての値型を事前に知っている場合)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;
}

ただしmaprepeated内部では使用できませんoneof

  1. オプションのフィールドを使用して、それらすべてをメッセージ定義の値として定義できます。次に、それらだけを設定し、実際に使用します。

  2. ラッパー、または既知のタイプを使用できます。例Value:https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#google.protobuf.Value

編集

の場合、次のValueように使用できます。

map<string, google.protobuf.Value> dict = 1;
  1. struct(for_stackによって提案されているように)使用法はここで見ることができます:PythonディクトからProtobuf構造体をどのように作成しますか?