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 <[email protected] > <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 [email protected] <javascript:>. >> To post to this group, send email to [email protected] >> <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 [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.
