Elenco dei dizionari protobuf
Sto cercando di definire un elenco di dizionari nel mio .proto
Tutti gli esempi che ho trovato forniscono un dizionario con un'unica chiave, coppia di valori:
message Pair {
string key = 1;
string value = 2;
}
message Dictionary {
repeated Pair pairs = 1;
}
o qualcosa di simile:
message Dictionary {
message Pair {
map<string, string> values = 1;
}
repeated Pair pairs = 1;
}
ma come gestirei un dizionario più ampio di tipi misti?
{
'k1': 1,
'k2': 2,
'k3': 'three',
'k4': [1,2,3]
}
Per complicare ulteriormente le cose, una volta definito il dizionario dei valori misti devo creare un messaggio che sia un elenco di questi dizionari. Presumo che sia facile come creare un altro messaggio ripetuto con il dizionario annidato:
message DictList {
repeated Dictionary dlist = 1;
}
Risposte
Poche idee che mi sono venute:
- Sembra che dovrebbe essere possibile (se conosci tutti i tipi di valore in anticipo) da utilizzare
oneof
per il valore (https://developers.google.com/protocol-buffers/docs/proto3#oneof). Questo potrebbe risolvere il problema, ad es
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;
}
Non puoi usare map
o repeated
dentro oneof
però.
È possibile utilizzare campi facoltativi e definirli tutti come valori nella definizione del messaggio. Quindi imposta solo quelli che usi effettivamente.
Potresti usare wrapper o tipi noti, ad esempio
Value
:https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#google.protobuf.Value
MODIFICARE
per il Value
, potrebbe essere usato in questo modo:
map<string, google.protobuf.Value> dict = 1;
- Usa
struct
(come suggerito da for_stack), potrebbe essere visto qui: Come si crea un Protobuf Struct da un Python Dict?