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={};
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 = ; i < info.neq; ++i)
{
char str[] = {};
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={};
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 = ;
     //遍历里面的记录
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 = {};
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的更多相关文章

  1. Boost property_tree解析json

    使用Boost property_tree解析json 之前使用jsoncpp解析json,现在才知道boost就有解析的库,学习一下吧 property_tree可以解析xml,json,ini,i ...

  2. Java构造和解析Json数据的两种方法详解二

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面接着介绍用org.json构造和解析Jso ...

  3. Java构造和解析Json数据的两种方法详解一

    一.介绍 JSON-lib包是一个beans,collections,maps,java arrays 和XML和JSON互相转换的包,主要就是用来解析Json数据,在其官网http://www.js ...

  4. JSON.stringify()方法是将一个javascript值(对象或者数组)转换成为一个JSON字符串;JSON.parse()解析JSON字符串,构造由字符串描述的javascript值或对象

    JSON.stringify()方法是将一个javascript值(对象或者数组)转换成为一个JSON字符串:JSON.parse()解析JSON字符串,构造由字符串描述的javascript值或对象

  5. JSON构造/解析(by C)---cJSON和json-c

    背景 JSON即JavaScript Object Notation,是一种轻量级的数据交换格式. JSON建构于两种结构: "名称/值"对的集合(A collection of ...

  6. Java构造和解析Json数据的两种方法详解二——org.json

    转自:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/24/3096437.html 在www.json.org上公布了很多JAVA下的jso ...

  7. Java构造和解析Json数据的两种方法详解一——json-lib

    转自:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/23/3096001.html 在www.json.org上公布了很多JAVA下的jso ...

  8. C++构造和解析JSON

    JSON是一种轻量级的数据交互格式,易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率,实际项目中经常用到,相比xml有很多优点,问问度娘,优点一箩筐. 第三方库 json解析选用j ...

  9. Android异步加载访问网络图片-解析json

    来自:http://www.imooc.com/video/7871 推荐大家去学习这个视频,讲解的很不错. 慕课网提供了一个json网址可以用来学习:http://www.imooc.com/api ...

随机推荐

  1. nginx安装pcre

    一.有的服务器上没有安装pcre那么安装nginx的时候会报错 所以在安装之前我们可以: yum install pcre-devel 如果很不巧,服务器也没有配yum,也不能连互联网.那么我们只能自 ...

  2. [iOS翻译]《iOS7 by Tutorials》系列:在Xcode 5里使用单元测试(上)

    简介: 单元测试是软件开发的一个重要方面.毕竟,单元测试可以帮你找到bug和崩溃原因,而程序崩溃是Apple在审查时拒绝app上架的首要原因. 单元测试不是万能的,但Apple把它作为开发工具包的一部 ...

  3. LINUX SSH显示中文乱码

    ssh登陆后,执行: export LANG=zh_CN.gb2312就可以显示中文了.编辑/etc/sysconfig/i18n 将LANG="zh_CN.UTF-8" 改为 L ...

  4. BigDecimal 使用方法详解

    BigDecimal 使用方法详解 博客分类: java基础 bigdecimalmultiplyadddivide  BigDecimal 由任意精度的整数非标度值 和 32 位的整数标度 (sca ...

  5. Windows10+Ubuntu双系统安装[多图]

    最近因为毕设重新回归Ubuntu,手头有一台装了Win10的ThinkPad X240s,最终成功完成了Windows 10 教育版和Ubuntu Kylin 15.10 的双系统配置,下文(多图慎入 ...

  6. [CareerCup] 1.8 String Rotation 字符串的旋转

    1.8 Assume you have a method isSubstring which checks if one word is a substring of another. Given t ...

  7. 20135306黄韧 附录A及第十章学习总结

    附录A  错误处理 A.1 Unix系统中的错误处理 1.Unix风格的错误处理 if ((pid = wait(NULL)) < 0) { fprintf(stderr,”wait error ...

  8. 【面试必备】Swift 面试题及其答案

    初级 问题1- Swift 1.0 or later 什么是optional类型,它是用来解决什么问题的? 答案:optional类型被用来表示任何类型的变量都可以表示缺少值.在Objective-C ...

  9. google map api v2的使用详细过程,图文并茂(原创)

    上一篇中说到怎么获取key,下面来介绍怎么使用key来显示google地图 步骤1:eclipse上打开android SDK Manager,安装google play services. 步骤2: ...

  10. TPLINK GPL code 简要分析

    从TPLINK官网下载了GPL code,下载后文件名是wr841nv9_en_gpl.tar.gz, 但是无论是linux还是windows下解压都提示压缩包有问题,不过还是可以解压出完整的目录的. ...