Liste des dictionnaires Protobuf
J'essaye de définir une liste de dictionnaires dans mon .proto
Tous les exemples que j'ai trouvés fournissent un dictionnaire avec une seule paire clé / valeur:
message Pair {
string key = 1;
string value = 2;
}
message Dictionary {
repeated Pair pairs = 1;
}
ou quelque chose comme:
message Dictionary {
message Pair {
map<string, string> values = 1;
}
repeated Pair pairs = 1;
}
mais comment gérer un plus grand dictionnaire de types mixtes?
{
'k1': 1,
'k2': 2,
'k3': 'three',
'k4': [1,2,3]
}
Pour compliquer davantage les choses, une fois que j'ai défini le dictionnaire des valeurs mixtes, je dois créer un message qui est une liste de ces dictionnaires. Je suppose que c'est aussi simple que de créer un autre message répété avec le dictionnaire imbriqué:
message DictList {
repeated Dictionary dlist = 1;
}
Réponses
Quelques idées que j'ai trouvées:
- Il semble qu'il devrait être possible (si vous connaissez tous les types de valeur à l'avance) d'utiliser
oneof
pour value (https://developers.google.com/protocol-buffers/docs/proto3#oneof). Cela pourrait résoudre le problème, par exemple
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;
}
Vous ne pouvez pas utiliser map
ou à l' repeated
intérieur de oneof
cependant.
Vous pouvez utiliser des champs facultatifs et les définir tous comme valeurs dans la définition de message. Ensuite, ne définissez que ceux que vous utilisez réellement.
Vous pouvez utiliser des wrappers ou des types connus, par exemple
Value
:https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#google.protobuf.Value
ÉDITER
pour le Value
, il pourrait être utilisé comme ceci:
map<string, google.protobuf.Value> dict = 1;
- Utilisez
struct
(comme suggéré par for_stack), peut être vu ici: Comment créer un Protobuf Struct à partir d'un Dict Python?