首先从最简单的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)