使用nlohmann库实现Json数据转为protobuf数据。核心代码如下,代码细节咨询可以留言:
int json2pb(const std::string& json,Message* msg)
{
Json j=Json::parse(json);
int ret=parse_json(j,msg); //解析json
std::cout<<"msg信息:"<<msg-DebugString();
return ret;
}
static int parse_json(const Json json,Message* msg)
{
const Descriptor* d = msg->GetDescriptor();//获取message(pb)数据的描述
const Reflection* ref=msg->GetReflection();//获取message属下和方法
if(!d||!ref)
{
std::cout<<"invalid pb object"<<std::endl;
}
for(auto& itr::Json::iterator_wrapper(json))//遍历json数据
{
const std::string name =itr.key(); //获取key
const FieldDescritpor* field=d->FindFieldByname(name);//通过name获取field
if(field->is_repeated())
{
//当字段为repeated(),对字段的值进行遍历
for(auto& ait::json::iterator_wrapper(itr.value())
{
int ret=json2field(ait.value(),msg,field);//json-〉field
if(ret!=0)
{
return ret;
}
}
}
else
{
int ret=json2field(itr.value(),msg,field);
if(ret!=0)
{
return ret;
}
}
}
}
static int json2field(const Json json,Message* msg,const FieldDescritor *field)
{
const Reflection* ref = msg->GetReflection();
const bool repeated=field->is_repeated();
switch(field->cpp_type())
{
case FieldDescriptor::CPPTYPE_INT32;//获取字段数据类型
{
if(repeated)
{
ref->AddInt32(msg,field,json);//字段为repeated时add数据,否则set数据。
}
else
{
ref->SetInt32(msg,field,json);
}
break;
}
...//其他类型如int32,int64,bool,enum,message类型实现类似
default:
break;
}
return 0;
}