On Tue, Apr 12, 2016 at 5:18 PM, Zachary Deretsky <[email protected]>
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].
> 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.

Reply via email to