JSON

protobuf转json,protobufjson

字号+ 作者:H5之家 来源:H5之家 2017-11-29 16:25 我要评论( )

protobuf转json,protobufjson。protobuf转json,protobufjson 方法介绍 protobuf的介绍在这里就不详细介绍了,主要是俺也是刚接触,感兴趣的同学可以去搜索相关

protobuf转json,protobufjson
方法介绍

    protobuf的介绍在这里就不详细介绍了,主要是俺也是刚接触,感兴趣的同学可以去搜索相关博客或者直接去看源码以及google的官方文档(官方文档表示很吃力)或者去这个网站:https://developers.google.com/protocol-buffers/docs/overview查看相应内容,这里面内容很全面,可以很方面的查询各个函数的使用方法以及功能。本篇文章主要介绍一下本人最近做的一个protobuf转json的小工具,下面进行拆分讲解,完整的代码在:git@github.com:chengfeiGitHub/P-bToJson.git。

    protobuf自带一个MessageToJson()的函数可以将对应的消息转换成json,一般情况下该函数可以满足转换需求。但是,最近项目的要求使用MessageToJson()无法实现,主要要求是:

    主要有这三个要求,对于功能2、3现在最新的protobuf应该是支持的,但是没有功能1的实现方式,所以只好自己写一个小工具。

    说明:本工具由C++编写完成

    首先是函数的声明:

1 #pragma once 2 #include <iostream> 3 #include <google/protobuf/message.h> 4 #include <google/protobuf/descriptor.h> ChooseSomeFieldsToJson(std::string& pb2jsonstring, const ::google::protobuf::Message& msg, std::vector<uint>& needs, bool Enum_2_Str, bool Showzero); GetRepeatedJson(std::string& pb2jsonstring, const ::google::protobuf::Message& msg, const google::protobuf::FieldDescriptor *field, const ::google::protobuf::Reflection *reflection, bool Enum_2_Str,bool Showzero); 9 void NeedEmptyToJson(std::string& pb2jsonstring, const ::google::protobuf::Message& msg, bool Enum_2_Str, bool Showzero); 10 void NeedNotEmptyToJson(std::string& pb2jsonstring, const ::google::protobuf::Message& msg, std::vector<uint>& needs, bool Enum_2_Str, bool Showzero); 11 int AppendTmpString1(std::string& pb2jsonstring,std::string& tmp_string, int judge); 12 int AppendTmpString2(std::string& pb2jsonstring,std::string& tmp_string, int judge);

 

    pb2jsonstring是存储转换结果的字符串,msg是需要转换的消息,needs是需要转换的字段号;函数GetRepeatedJson()是对重复的字段进行操作;NeedEmptyToJson()是当needs为空时对应的操作(needs为空表示需要转换所有的字段);NeedNotEmptyToJson()是当needs不为空时对应的操作;AppendTmpStrign1()以及AppendTmpStrign2()是将临时字符串添加到pb2jsonstring后的操作。

    上面的代码保存到一个头文件当中,就叫pbjsontest3.h吧,然后是pbjsontest3.cpp

    

1 #include <iostream> 2 #include <google/protobuf/descriptor.h> 3 #include <google/protobuf/message.h> 4 #include <set> 5 #include <string> ::google::protobuf; ChooseSomeFieldsToJson(std::string& pb2jsonstring, const ::google::protobuf::Message& msg, std::vector<uint>& need, bool Enum_2_Str, bool Showzero) 11 { Descriptor* descriptor = msg.GetDescriptor(); 14 const Reflection* reflection = msg.GetReflection(); { 17 NeedEmptyToJson(pb2jsonstring, msg, Enum_2_Str, Showzero); 18 } { 21 NeedNotEmptyToJson(pb2jsonstring, msg, need, Enum_2_Str, Showzero); 22 } 23 }

    这一部分主要就是判断need是否为空,然后选择相应的函数进行操作,不在做详细的叙述,下面是NeedEmptyToJson()的介绍。由于这一部分代码太长,所以相应的介绍在代码中进行注释说明。

1 void NeedEmptyToJson(std::string& pb2jsonstring, const ::google::protobuf::Message& msg, bool Enum_2_Str, bool Showzero) 2 { 3 const Descriptor* descriptor = msg.GetDescriptor(); 4 const Reflection* reflection = msg.GetReflection(); count = descriptor->field_count(); judge = std::std::int32_t v32=0; 9 std::uint32_t vu32=0; 10 std::int64_t v64=0; 11 std::uint64_t vu64=0; 12 double vd=0; 13 std::string str; ); (int it = 0; it <count; ++it) 16 { 17 const FieldDescriptor* goal_field=descriptor->field(it); (nullptr==goal_field) { 21 continue; 22 } (goal_field->is_repeated()) { 26 if (reflection->FieldSize(msg, goal_field) > 0) 27 { 28 tmp_string=""; ).append(goal_field->name()).append(); ); GetRepeatedJson(tmp_string, msg, goal_field, reflection, Enum_2_Str,Showzero); ); 33 judge = AppendTmpString1(pb2jsonstring,tmp_string,judge); 34 } 35 continue; 36 } 37 switch (goal_field->type()) 38 { 39 case FieldDescriptor::TYPE_MESSAGE: 40 { 41 const Message& tmp_msg = reflection->GetMessage(msg, goal_field); 42 if (0 != tmp_msg.ByteSize()) 43 { 44 tmp_string=""; ).append(goal_field->name()).append(); 46 NeedEmptyToJson(tmp_string,tmp_msg, Enum_2_Str, Showzero); 47 judge = AppendTmpString1(pb2jsonstring,tmp_string,judge); 48 } 49 } 50 break; FieldDescriptor::TYPE_INT32: 53 { 54 v32=reflection->GetInt32(msg, goal_field); 55 if(v32==0) 56 { { 59 tmp_string=""; ).append(goal_field->name()).append(); judge = AppendTmpString1(pb2jsonstring,tmp_string,judge); 63 } 64 } { 67 tmp_string=""; ).append(goal_field->name()).append(); 69 tmp_string.append(std::to_string(v32)); 70 judge = AppendTmpString1(pb2jsonstring,tmp_string,judge); 71 } 72 } 73 break; FieldDescriptor::TYPE_UINT32: 76 { 77 vu32=reflection->GetUInt32(msg, goal_field); 78 if(vu32==0) 79 { 80 if(Showzero) 81 { 82 tmp_string=""; ).append(goal_field->name()).append(); 84 tmp_string.append(std::to_string(vu32)); 85 judge = AppendTmpString1(pb2jsonstring,tmp_string,judge); 86 } 87 } { 90 tmp_string=""; ).append(goal_field->name()).append(); 92 tmp_string.append(std::to_string(vu32)); 93 judge = AppendTmpString1(pb2jsonstring,tmp_string,judge); 94 } 95 } 96 break; FieldDescriptor::TYPE_INT64: 99 { 100 v64=reflection->GetInt64(msg, goal_field); 101 if(v64==0) 102 { 103 if(Showzero) 104 { 105 tmp_string=""; ).append(goal_field->name()).append(); 107 tmp_string.append(std::to_string(v64)); 108 judge = AppendTmpString1(pb2jsonstring,tmp_string,judge); 109 } 110 } { 113 tmp_string=""; ).append(goal_field->name()).append(); 115 tmp_string.append(std::to_string(v64)); 116 judge = AppendTmpString1(pb2jsonstring,tmp_string,judge); 117 } 118 } 119 break; 120 case FieldDescriptor::TYPE_UINT64: 121 { 122 vu64=reflection->GetUInt64(msg, goal_field); 123 if(vu64==0) 124 { 125 if(Showzero) 126 { 127 tmp_string=""; ).append(goal_field->name()).append(); 129 tmp_string.append(std::to_string(vu64)); 130 judge = AppendTmpString1(pb2jsonstring,tmp_string,judge); 131 } 132 } { 135 tmp_string=""; ).append(goal_field->name()).append(); 137 tmp_string.append(std::to_string(vu64)); 138 judge = AppendTmpString1(pb2jsonstring,tmp_string,judge); 139 } 140 } 141 break; 142 case FieldDescriptor::TYPE_STRING: 143 case FieldDescriptor::TYPE_BYTES: 144 { 145 146 str=reflection->GetString(msg, goal_field); 147 if(str.empty()) 148 { 149 if(Showzero) 150 { 151 tmp_string=""; ).append(goal_field->name()).append(); ).append(str).append(); 154 judge = AppendTmpString1(pb2jsonstring,tmp_string,judge); 155 } 156 } { 159 tmp_string=""; ).append(goal_field->name()).append(); ).append(str).append(); 162 judge = AppendTmpString1(pb2jsonstring,tmp_string,judge); 163 164 } 165 } 166 break; 167 case FieldDescriptor::TYPE_DOUBLE: 168 { 169 vd=reflection->GetDouble(msg, goal_field); 170 if(vd==0) 171 { 172 if(Showzero) 173 { 174 tmp_string=""; ).append(goal_field->name()).append(); 176 tmp_string.append(std::to_string(vd)); 177 judge = AppendTmpString1(pb2jsonstring,tmp_string,judge); 178 } 179 } { 182 tmp_string=""; ).append(goal_field->name()).append(); 184 tmp_string.append(std::to_string(vd)); 185 judge = AppendTmpString1(pb2jsonstring,tmp_string,judge); 186 } 187 } 188 break; 189 case FieldDescriptor::TYPE_BOOL: 190 { 191 tmp_string=""; ).append(goal_field->name()).append(); 193 if (reflection->GetBool(msg, goal_field)) ); tmp_string.append(); 197 judge = AppendTmpString1(pb2jsonstring,tmp_string,judge); 198 199 } 200 break; 201 case FieldDescriptor::TYPE_ENUM: 202 { 203 tmp_string=""; ).append(goal_field->name()).append(); { ).append(reflection->GetEnum(msg,goal_field)->name()).append(); 208 } { enumstr[8]; 212 memset(enumstr, 0, sizeof(enumstr)); , reflection->GetEnum(msg,goal_field)->number()); 214 tmp_string.append(enumstr); 215 } 216 judge = AppendTmpString1(pb2jsonstring,tmp_string,judge); 217 } 218 break; 219 default: 220 break; 221 } 222 } ); 224 } AppendTmpString1(std::string &pb2jsonstring,std::string &tmp_string, int judge) 227 { 228 if ( judge!=0 && tmp_string.length()!=0) 229 { ).append(tmp_string); 231 return judge; 232 } (judge==0 && tmp_string.length()!=0) 234 { 235 pb2jsonstring.append(tmp_string); ; 237 } 238 return judge; 239 }

 

    下面need不为空时候的转换:

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • Java Bean和JSON相互转换的思路

    Java Bean和JSON相互转换的思路

    2017-11-30 10:17

  • Ajax+Jsp+servlet+json技术的使用

    Ajax+Jsp+servlet+json技术的使用

    2017-11-29 12:22

  • 教程|JSON处理1.1:JSON指针挑战和应对

    教程|JSON处理1.1:JSON指针挑战和应对

    2017-11-29 10:13

  • Python的数据序列化「Json Pickle」

    Python的数据序列化「Json Pickle」

    2017-11-28 12:09

网友点评