使用nlohmann库实现json数据转为protobuf数据

使用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信息:"<
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"<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;
}

 

你可能感兴趣的:(网络传输,c++,protobuf,json,c++)