The Official documentation about map type says:
map<key_type, value_type> map_field = N;...where the key_type can be any integral or string type (so, any scalar type except for floating point types and bytes). The value_type can be any type.
I want to define a map<string, repeated string> field, but it seems illegal on my libprotoc 3.0.0, which complains Expected ">". So I wonder if there is any way to put repeated string into map.
A Possible workaround could be:
message ListOfString {
repeated string value = 1;
}
// Then define:
map<string, ListOfString> mapToRepeatedString = 1;
But ListOfString here looks redundant.
I had the same need, and got the same error. I do not believe this is possible. Here is the relevant BNF definitions from the language specification.
https://developers.google.com/protocol-buffers/docs/reference/proto3-spec
"repeated" keyword only appears in the field definition. The map definition requires a "type", which does not include the repeated keyword.
That means there are a few options.
message MapFieldEntry { key_type key = 1; repeated value_type value = 2; } repeated MapFieldEntry map_field = N;You would need to convert the data to a map yourself, but this should be fairly trivial in most languages. In Java:List<MapFieldEntry> map_field = // Existing list from protobuf. Map<key_type, List<value_type>> = map_field.stream() .collect(Collectors.toMap(kv -> kv.key, kv -> kv.value));