利用BOOST,解释JSON

5 篇文章 0 订阅
1 篇文章 0 订阅

首先从最简单的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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值