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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酷小川

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值