• boost构造,解析json


    void asynDBCenter::isGetActorInfoEx(void* on_process, const char* arg)
    {
        std::stringstream ros(arg);
        boost::property_tree::ptree pt;
        boost::property_tree::read_json(ros, pt);
        int actorID = pt.get<int>("actorID");
    
        ActorInfoEx info={0};
        bool ret = m_dbcenter->getActorInfoEx(actorID, &info);
         
        std::stringstream wos;
        boost::property_tree::ptree root,child_eq, child_kep;
        root.put<bool>("ret", ret);
        if(ret)
        {
            root.put<int>("_id", info.actor.id);
            root.put<std::string>("name", info.actor.name);
            root.put<int>("sex", info.actor.sex);
            root.put<int>("prof", info.actor.prof);
            root.put<int>("uid", info.uid);
            root.put<int>("gold", info.gold);
            root.put<int>("map", info.map);
            root.put<int>("cur_hp", info.stat.cur_hp);
            root.put<int>("max_hp", info.stat.max_hp);
            root.put<int>("cur_mp", info.stat.cur_mp);
            root.put<int>("max_mp", info.stat.max_mp);
            root.put<int>("x", info.pos.x);
            root.put<int>("y", info.pos.y);
            root.put<int>("level", info.level);
            root.put<int>("neq", info.neq);
         //插入"":{"":"",
         //    "":""}
         //形式的json
    for(int i = 0; i < info.neq; ++i) { char str[10] = {0}; sprintf(str, "epos%02d", i); child_eq.put<int>(str, info.eqs[i]); } root.put_child("eqs", child_eq);
       //插入"":[
        //    {"":""},
        //    {"",""}
        //  ]数组类型的文档
        
    for (auto kk:info.vctKk) { boost::property_tree::ptree child; child.put<int>("id", kk.eid); child.put<int>("pos_x", kk.epos.x); child.put<int>("pos_y", kk.epos.y); child_kep.push_back(std::make_pair("", child)); } root.put_child("keqs",child_kep); } boost::property_tree::write_json(wos, root); HrPkt pkt; pkt.hr = wos.str(); pkt.on_process = on_process; pkt.process = std::bind(&asynDBCenter::onGetActorInfoEx, this, std::placeholders::_1, std::placeholders::_2); push_hr(pkt); }

     针对上面构造的进行解析

    void asynDBCenter::onGetActorInfoEx(void* on_process, const char* arg)
    {
        std::stringstream os(arg);
        boost::property_tree::ptree root;
        boost::property_tree::read_json(os, root);
        ActorInfoEx actEx={0};
        bool ret = root.get<bool>("ret");
        if(ret)
        {
            actEx.actor.id = root.get<int>("_id");
            strcpy(actEx.actor.name, root.get<std::string>("name").c_str());
            actEx.actor.sex = (DB::sex)root.get<int>("sex");
            actEx.actor.prof = (RoleProf)root.get<int>("prof");
            actEx.uid = root.get<int>("uid");
            actEx.gold = root.get<int>("gold");
            actEx.map = root.get<int>("map");
            actEx.stat.cur_hp = root.get<int>("cur_hp");
            actEx.stat.max_hp = root.get<int>("max_hp");
            actEx.stat.cur_mp = root.get<int>("cur_hp");
            actEx.stat.max_mp = root.get<int>("max_mp");
            actEx.pos.x = root.get<int>("x");
            actEx.pos.y = root.get<int>("y");
            actEx.level = root.get<int>("level");
            actEx.neq = root.get<int>("neq");
            auto child = root.get_child("eqs");
            int i = 0;
         //遍历里面的记录
    for(auto it : child) { actEx.eqs[i++] = it.second.get_value<int>(); if(i >= MAX_EQ_NUMB) break; } auto arr = root.get_child("keqs");
        //遍历数组中的文档
    for (auto it:arr) { KnapsackEq kk = {0}; kk.eid = it.second.get<int>("id"); kk.epos.x = it.second.get<int>("pos_x"); kk.epos.y = it.second.get<int>("pos_y"); actEx.vctKk.push_back(kk); } } auto on_getActorInfoEx = *(std::function<void(bool, ActorInfoEx) >*)on_process; on_getActorInfoEx(ret, actEx); }

     boost::property_tree::ptree感觉就像是一个树,每个节点有key,value,不是二叉树,value又可以指向下面的节点。

    put_child:只有当是文档对象或者数组时才使用(好像)

  • 相关阅读:
    H5学习的第三周
    2017.3.12 H5学习的第一周
    js中比较实用的函数用法
    JS学习中遇到的一些题目
    H5学习第四周
    idea快捷键
    中国国内可用API合集
    ssm整合 idea+maven版
    Dubbo的使用及原理浅析
    $.extend 和$.fn.extend的区别
  • 原文地址:https://www.cnblogs.com/zzyoucan/p/3658544.html
Copyright © 2020-2023  润新知