Список словарей Protobuf
Я пытаюсь определить список словарей в моем .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;
}
Ответы
Несколько идей, которые у меня возникли:
- Кажется, должно быть возможно (если вы заранее знаете все типы значений) использовать
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;
}
Вы не можете использовать map
или repeated
внутри oneof
.
Вы можете использовать необязательные поля и определить их все как значения в определении сообщения. Затем установите только те, которые вы действительно используете.
Вы можете использовать обертки или известные типы, например
Value
:https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#google.protobuf.Value
РЕДАКТИРОВАТЬ
для Value
, это можно было бы использовать так:
map<string, google.protobuf.Value> dict = 1;
- Использование
struct
(как предлагается for_stack) можно увидеть здесь: Как создать Protobuf Struct из Python Dict?