boost构造,解析json
2014-04-11 13:34
363 查看
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:只有当是文档对象或者数组时才使用(好像)
相关文章推荐
- boost构造和解析json
- C++的Json解析库:jsoncpp和boost
- Java构造和解析Json数据的两种方法详解
- fastjson使用(一) -- 最常用的功能[构造和解析JSON]
- Json格式与C++构造解析
- C++的Json解析库:jsoncpp和boost
- Java构造和解析Json数据的两种方法详解一
- ubuntu-boost解析json文件
- Java构造和解析Json数据的两种方法详解一
- JSON构造/解析(by C)---cJSON和json-c
- Java构造和解析Json数据的两种方法详解一
- Java构造和解析Json数据的两种方法详解2
- Java构造和解析Json数据的两种方法(json-lib构造和解析Json数据, org.json构造和解析Json数据)
- C++的Json解析库:jsoncpp和boost
- C++的Json解析库:jsoncpp和boost
- Java如何像Python一样简洁地构造和解析Json 数据
- Java构造和解析Json数据的两种方法详解二
- C++的Json解析库:jsoncpp和boost .