Thanks Adam. Can you please let me know which API I can use to do reflection on a map?
Regards, Qian Zhang On Mon, Jun 5, 2017 at 11:42 PM, Adam Cozzette <[email protected]> wrote: > Doing reflection on a map is a little bit tricky, but the way to do it is > to treat it as a repeated field since that is how it is actually > represented on the wire. A map is a stored as a repeated message field, > where in each message the key is field 1 and the value is field 2. > > On Mon, Jun 5, 2017 at 1:37 AM, Qian Zhang <[email protected]> wrote: > >> Hi Adam, >> >> We are using picojson <https://github.com/kazuho/picojson> to parse the >> JSON file. >> >> After more debugging, I think I have found the root cause: In the code >> here >> <https://github.com/apache/mesos/blob/1.2.0/3rdparty/stout/include/stout/protobuf.hpp#L575>, >> we are trying to find a field by the key of an entry in a map, obviously it >> will fail since the key of any map entries is not in the protobuf message >> definition (the .proto file), and to avoid finding field by a map entry's >> key, in this method >> <https://github.com/apache/mesos/blob/1.2.0/3rdparty/stout/include/stout/protobuf.hpp#L387:L407>, >> we need to check if "field->is_map()" is true which is currently missed, if >> the field is a map, then we should use the reflection to construct a map >> message, however I do not find a method in protobuf to do that, I find a >> lot of "Addxxx()" methods (e.g., "AddString()", "AddInt64()", etc.), but >> not a method for adding a map. There is a method >> "InsertOrLookupMapValue()", but that is a private method which I can not >> call in my code. >> >> So can you please suggest how to add a map message? Thanks! >> >> >> Regards, >> Qian Zhang >> >> On Sat, Jun 3, 2017 at 1:02 AM, Adam Cozzette <[email protected]> >> wrote: >> >>> It looks to me like your JSON syntax is right. Could you post the C++ >>> code you are using to parse the JSON file? >>> >>> On Fri, Jun 2, 2017 at 1:16 AM, Qian Zhang <[email protected]> wrote: >>> >>>> Hi, >>>> >>>> I have a C++ project in which there is a .proto file, and in that file, >>>> there is protobuf message which has a map field: >>>> "map<string, string> annotations = 5;" >>>> >>>> And the JSON file to be parsed with that .proto file has the following >>>> content: >>>> "annotations": { >>>> "com.example.key1": "value1", >>>> "com.example.key2": "value2" >>>> } >>>> >>>> The .proto file is in proto2 syntax (it has "syntax = "proto2";" at the >>>> beginning) and I am using protobuf-3.3.0, the compilation succeed, but I >>>> found the annotation map always has only one entry, and both the entry's >>>> key and value are "" which is obviously not correct. >>>> >>>> Any suggestions? >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "Protocol Buffers" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to [email protected]. >>>> To post to this group, send email to [email protected]. >>>> Visit this group at https://groups.google.com/group/protobuf. >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> >>> >> > -- You received this message because you are subscribed to the Google Groups "Protocol Buffers" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/protobuf. For more options, visit https://groups.google.com/d/optout.
