Liste des dictionnaires Protobuf

Aug 18 2020

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

1 dmaixner Aug 18 2020 at 17:22

Quelques idées que j'ai trouvées:

  1. Il semble qu'il devrait être possible (si vous connaissez tous les types de valeur à l'avance) d'utiliser oneofpour 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 mapou à l' repeatedintérieur de oneofcependant.

  1. 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.

  2. 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;
  1. Utilisez struct(comme suggéré par for_stack), peut être vu ici: Comment créer un Protobuf Struct à partir d'un Dict Python?