Protobuf Liste der Wörterbücher

Aug 18 2020

Ich versuche, eine Liste von Wörterbüchern in meinem .proto zu definieren

Alle Beispiele, die ich gefunden habe, bieten ein Wörterbuch mit einem einzigen Schlüssel-Wert-Paar:

message Pair {
   string key = 1;
   string value = 2;
}

message Dictionary {
   repeated Pair pairs = 1;
}

oder so ähnlich wie:

message Dictionary {
    message Pair {
        map<string, string> values = 1;
    }
    repeated Pair pairs = 1;
}

aber wie würde ich mit einem größeren Wörterbuch gemischter Typen umgehen?

{
'k1': 1,
'k2': 2,
'k3': 'three',
'k4': [1,2,3]
}

Um die Sache noch weiter zu verkomplizieren, muss ich nach dem Definieren des Wörterbuchs mit gemischten Werten eine Nachricht erstellen, die eine Liste dieser Wörterbücher enthält. Ich gehe davon aus, dass dies so einfach ist wie das Erstellen einer weiteren wiederholten Nachricht mit dem verschachtelten Wörterbuch:

message DictList {
    repeated Dictionary dlist = 1;
}

Antworten

1 dmaixner Aug 18 2020 at 17:22

Einige Ideen, die ich mir ausgedacht habe:

  1. Es scheint möglich zu sein (wenn Sie alle Werttypen im Voraus kennen), oneoffür den Wert zu verwenden (https://developers.google.com/protocol-buffers/docs/proto3#oneof). Das könnte das Problem lösen, z
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;
}

Sie können nicht mapoder repeatedinnerhalb von verwenden oneof.

  1. Sie können optionale Felder verwenden und alle als Werte in der Nachrichtendefinition definieren. Stellen Sie dann nur die ein, die Sie tatsächlich verwenden.

  2. Sie können Wrapper oder bekannte Typen verwenden, z Value.https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#google.protobuf.Value

BEARBEITEN

für die Valuekönnte es so verwendet werden:

map<string, google.protobuf.Value> dict = 1;
  1. Die Verwendung struct(wie von for_stack vorgeschlagen) ist hier zu sehen: Wie erstellt man eine Protobuf-Struktur aus einem Python-Diktat?