利用BOOST,解释JSON

来源:互联网 发布:淘宝网买家地域解读 编辑:程序博客网 时间:2024/05/29 18:57

首先从最简单的JSON脚本开始;

假设JSON脚本是:{"userId":"123456","userName":"Alex","company":"HugenessHard"}

这可能是最简单的JSON脚本,再简单就没办法说明问题了。

注:C++中双引号需加入转意符

#include <iostream>#include <boost/property_tree/ptree.hpp>#include <boost/property_tree/json_parser.hpp>#include <string>int main(int argc, char** argv){//NO.1 {"userId":"123456","userName":"Alex","company":"HugenessHard"}using namespace std;using namespace boost;using namespace boost::property_tree;ptree pt;string strJson = "{\"userId\":\"123456\",\"userName\":\"Alex\",\"company\":\"HugenessHard\"}";stringstream stream;stream << strJson;read_json(stream, pt);try{cout << "UserId:" << pt.get<string>("userId") << endl;cout << "UserName:" << pt.get<string>("userName") << endl;cout << "UserCompany:" << pt.get<string>("company") << endl;}catch (std::exception ex){cout << ex.what();}cin.get();return 0;}

输出结果:

UserId:123456

UserName:Alex

UserCompany:HugenessHard

--------------------------完美分割-----------------------------

假设上面的JSON脚本再加个子窜,client

JSON脚本将是:{"userId":"123456","userName":"Alex","company":"HugenessHard","client":[{"clientId":"1111","cname":"Mike","company":"Mikecompany"},{"clientId":"1111","cname":"Jack","company":"Jackcompany"}]}

注:为了简化程序,我就不加try/catch块了,现实中应catch异常,以防读取不存在的节点。

#include <iostream>#include <boost/property_tree/ptree.hpp>#include <boost/property_tree/json_parser.hpp>#include <string>int main(int argc, char** argv){//NO.2 {"userId":"123456","userName":"Alex","company":"HugenessHard","client":[{"clientId":"Mike","company":"Mikecompany"},{"clientId":"Jack","company":"Jackcompany"}]}using namespace std;using namespace boost;using namespace boost::property_tree;ptree pt, pt2;string strJson = "{\"userId\":\"123456\",\"userName\":\"Alex\",\"company\":\"HugenessHard\",\"client\":[{\"clientId\":\"1111\",\"cname\":\"Mike\",\"company\":\"Mikecompany\"},{\"clientId\":\"2222\",\"cname\":\"Jack\",\"company\":\"Jackcompany\"}]}";stringstream stream;stream << strJson;read_json(stream, pt);cout << "UserId:" << pt.get<string>("userId") << endl;cout << "UserName:" << pt.get<string>("userName") << endl;cout << "UserCompany:" << pt.get<string>("company") << endl;pt2 = pt.get_child("client");cout << "----Client----" << endl;for (ptree::iterator it = pt2.begin(); it != pt2.end(); ++it){cout << "ClientId:" << it->second.get<string>("clientId") << endl;cout << "ClientName:" << it->second.get<string>("cname") << endl;cout << "ClientCompany:" << it->second.get<string>("company") << endl;}cin.get();return 0;}
输出结果:

UserId:123456

UserName:Alex

UserCompany:HugenessHard

----Client----

ClientId:1111

ClientName:Mike

ClientCompany:Mikecompany

ClientId:2222

ClientName:Jack

ClientCompany:Jackcompany
总结:

ptree以JSON中的一对大括号为界为一个ptree对象

ptree的JSON对象中同样可以包括子对象,如例中的client节点,就是个子对象

client节点中存有2个客户信息。就需要用ptree的迭代器ptree::iterator,逐个读取子对象。

在读取节点时,应使和try块捕获异常。例如我们读取不存在的节点“age”

则会抛出异常 “No such node (age)”

另外,如果需要用宽字符集,可直接用wstring,wstringstream,wptree分别代替(类型名前加w)


0 0