I created a github issue. I am using proto3. I downloaded and installed grpc with protobuf following instructions here: https://github.com/grpc/grpc/blob/release-0_13/INSTALL.md I did this at the end of March. Regards, Zach.
On Wednesday, April 13, 2016 at 11:10:53 AM UTC-7, Feng Xiao wrote: > > > > On Tue, Apr 12, 2016 at 5:18 PM, Zachary Deretsky <zder...@gmail.com > <javascript:>> wrote: > >> {"intMap":["4":500,"0":100,"1":200,"2":300,"3":400]} >> > Which version of protobuf are you using? Clearly it should be using "{}" > rather than "[]" for map fields. Could you help create a github issue for > this bug? > https://github.com/golang/protobuf/issues > > >> >> The above json is declared invalid by several json validators. >> >> ZZZZZZZZZZZZZZZZZZZZZZ It is generated by the jtest.proto: >> >> syntax = "proto3"; >> package jtest; >> >> message Jmap { >> map<int32, int32> int_map = 2; >> } >> >> ZZZZZZZZZZZZZZZZZZZZZZZ make_json.cpp : >> >> #include <getopt.h> >> #include <chrono> >> #include <iostream> >> #include <fstream> >> #include <memory> >> #include <random> >> #include <string> >> #include <thread> >> >> #include <google/protobuf/text_format.h> >> #include <grpc/grpc.h> >> #include <grpc++/channel.h> >> #include <grpc++/client_context.h> >> #include <grpc++/create_channel.h> >> #include <grpc++/security/credentials.h> >> #include "netopt/proto/json2string.h" >> #include "jtest.grpc.pb.h" >> >> using grpc::Channel; >> using grpc::ClientContext; >> using grpc::ClientReader; >> using grpc::ClientReaderWriter; >> using grpc::ClientWriter; >> using grpc::Status; >> >> using jtest::Jmap; >> >> using ::google::protobuf::Map; >> using ::google::protobuf::int32; >> typedef ::google::protobuf::Map< ::google::protobuf::int32, >> ::google::protobuf::int32 > IntMap; >> typedef ::google::protobuf::MapPair< ::google::protobuf::int32, >> ::google::protobuf::int32 > IntPair; >> >> #define MAP_COUNT 5 >> >> >> Jmap MakeJmap() { >> Jmap m; >> IntMap* map_p =m.mutable_int_map(); >> for(int i = 0; i < MAP_COUNT; i++) { >> IntPair pair1(i, (i + 1)*100 ); >> map_p->insert(pair1); >> } >> return m; >> } >> >> int main(int argc, char** argv) { >> std::string m_file_name = "jmap.json"; >> std::string a_file_name = "array.json"; >> Jmap j = MakeJmap(); >> >> google::protobuf::util::Json2String j2s; >> google::protobuf::util::JsonOptions jo; >> // jo.add_whitespace = true; >> jo.always_print_primitive_fields = true; >> >> std::ofstream m_doc(m_file_name); >> if(!m_doc.is_open()) { >> GM_COUT << "Could not open " << m_file_name << ", EXITING!!!" << >> std::endl; >> return 1; >> } >> std::string m_line = j2s.ToJson(j, jo); >> if(m_line.empty()) { >> GM_COUT << "Could not print to string, EXITING!!!" << std::endl; >> return 1; >> } >> m_doc << m_line; >> m_doc.close(); >> >> return 0; >> } >> >> ZZZZZZZZZZZZZZZZZZZZ where json2string.h is: >> >> #include <google/protobuf/util/json_util.h> >> >> #include <list> >> #include <string> >> >> #include <google/protobuf/io/zero_copy_stream.h> >> #include <google/protobuf/util/type_resolver.h> >> #include <google/protobuf/util/type_resolver_util.h> >> #include "common/gen_headers/macros.h" >> #include "common/gen_headers/typedefs.h" >> >> namespace google { >> namespace protobuf { >> namespace util { >> static const char kTypeUrlPrefix[] = "type.googleapis.com"; >> >> static string GetTypeUrl(const Descriptor* message) { >> return string(kTypeUrlPrefix) + "/" + message->full_name(); >> } >> >> // As functions defined in json_util.h are just thin wrappers >> around the >> // JSON conversion code in //net/proto2/util/converter, in this >> test we >> // only cover some very basic cases to make sure the wrappers have >> forwarded >> // parameters to the underlying implementation correctly. More >> detailed >> // tests are contained in the //net/proto2/util/converter directory. >> class Json2String { >> public: >> Json2String() { >> resolver_.reset(NewTypeResolverForDescriptorPool(kTypeUrlPrefix, >> DescriptorPool::generated_pool())); >> } >> >> string ToJson(const Message& message, const JsonOptions& options) { >> string result; >> Status status = >> BinaryToJsonString(resolver_.get(), >> GetTypeUrl(message.GetDescriptor()), >> message.SerializeAsString(), &result, options); >> if(!status.ok()) { >> GM_COUT << status.ToString() << std::endl; >> } >> return result; >> } >> >> bool FromJson(const string& json, Message* message) { >> string binary; >> util::Status status = >> JsonToBinaryString(resolver_.get(), >> GetTypeUrl(message->GetDescriptor()), json, &binary); >> if(!status.ok()) { >> GM_COUT << status.ToString() << std::endl; >> return false; >> } >> >> return message->ParseFromString(binary); >> } >> >> google::protobuf::scoped_ptr<TypeResolver> resolver_; >> }; >> } // namespace util >> } // namespace protobuf >> } // namespace google >> >> >> -- >> 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 protobuf+u...@googlegroups.com <javascript:>. >> To post to this group, send email to prot...@googlegroups.com >> <javascript:>. >> 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 protobuf+unsubscr...@googlegroups.com. To post to this group, send email to protobuf@googlegroups.com. Visit this group at https://groups.google.com/group/protobuf. For more options, visit https://groups.google.com/d/optout.