Список словарей Protobuf

Aug 18 2020

Я пытаюсь определить список словарей в моем .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;
}

Ответы

1 dmaixner Aug 18 2020 at 17:22

Несколько идей, которые у меня возникли:

  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.

  1. Вы можете использовать необязательные поля и определить их все как значения в определении сообщения. Затем установите только те, которые вы действительно используете.

  2. Вы можете использовать обертки или известные типы, например Value:https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#google.protobuf.Value

РЕДАКТИРОВАТЬ

для Value, это можно было бы использовать так:

map<string, google.protobuf.Value> dict = 1;
  1. Использование struct(как предлагается for_stack) можно увидеть здесь: Как создать Protobuf Struct из Python Dict?