Boost property_tree解析json
使用Boost property_tree解析json
之前使用jsoncpp解析json,现在才知道boost就有解析的库,学习一下吧
property_tree可以解析xml,json,ini,info等格式的数据,用property_tree解析这几种格式使用方法很相似。
解析json很简单,命名空间为boost::property_tree,reson_json函数将文件流、字符串解析到ptree,write_json将ptree输出为字符串或文件流。其余的都是对ptree的操作。
解析json需要加头文件:
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
1. 解析json
解析一段下面的数据:
- {
- "code": 0,
- "images":
- [
- {
- "url": "fmn057/20111221/1130/head_kJoO_05d9000251de125c.jpg"
- },
- {
- "url": "fmn057/20111221/1130/original_kJoO_05d9000251de125c.jpg"
- }
- ]
- }
{
"code": 0,
"images":
[
{
"url": "fmn057/20111221/1130/head_kJoO_05d9000251de125c.jpg"
},
{
"url": "fmn057/20111221/1130/original_kJoO_05d9000251de125c.jpg"
}
]
}
- int ParseJson()
- {
- std::string str = "{\"code\":0,\"images\":[{\"url\":\"fmn057/20111221/1130/head_kJoO_05d9000251de125c.jpg\"},{\"url\":\"fmn057/20111221/1130/original_kJoO_05d9000251de125c.jpg\"}]}";
- using namespace boost::property_tree;
- std::stringstream ss(str);
- ptree pt;
- try{
- read_json(ss, pt);
- }
- catch(ptree_error & e) {
- return 1;
- }
- try{
- int code = pt.get<int>("code"); // 得到"code"的value
- ptree image_array = pt.get_child("images"); // get_child得到数组对象
- // 遍历数组
- BOOST_FOREACH(boost::property_tree::ptree::value_type &v, image_array)
- {
- std::stringstream s;
- write_json(s, v.second);
- std::string image_item = s.str();
- }
- }
- catch (ptree_error & e)
- {
- return 2;
- }
- return 0;
- }
int ParseJson()
{
std::string str = "{\"code\":0,\"images\":[{\"url\":\"fmn057/20111221/1130/head_kJoO_05d9000251de125c.jpg\"},{\"url\":\"fmn057/20111221/1130/original_kJoO_05d9000251de125c.jpg\"}]}";
using namespace boost::property_tree; std::stringstream ss(str);
ptree pt;
try{
read_json(ss, pt);
}
catch(ptree_error & e) {
return 1;
} try{
int code = pt.get<int>("code"); // 得到"code"的value
ptree image_array = pt.get_child("images"); // get_child得到数组对象 // 遍历数组
BOOST_FOREACH(boost::property_tree::ptree::value_type &v, image_array)
{
std::stringstream s;
write_json(s, v.second);
std::string image_item = s.str();
}
}
catch (ptree_error & e)
{
return 2;
}
return 0;
}
2. 构造json
- int InsertJson()
- {
- std::string str = "{\"code\":0,\"images\":[{\"url\":\"fmn057/20111221/1130/head_kJoO_05d9000251de125c.jpg\"},{\"url\":\"fmn057/20111221/1130/original_kJoO_05d9000251de125c.jpg\"}]}";
- using namespace boost::property_tree;
- std::stringstream ss(str);
- ptree pt;
- try{
- read_json(ss, pt);
- }
- catch(ptree_error & e) {
- return 1;
- }
- // 修改/增加一个key-value,key不存在则增加
- pt.put("upid", "00001");
- // 插入一个数组
- ptree exif_array;
- ptree array1, array2, array3;
- array1.put("Make", "NIKON");
- array2.put("DateTime", "2011:05:31 06:47:09");
- array3.put("Software", "Ver.1.01");
- exif_array.push_back(std::make_pair("", array1));
- exif_array.push_back(std::make_pair("", array2));
- exif_array.push_back(std::make_pair("", array3));
- // exif_array.push_back(std::make_pair("Make", "NIKON"));
- // exif_array.push_back(std::make_pair("DateTime", "2011:05:31 06:47:09"));
- // exif_array.push_back(std::make_pair("Software", "Ver.1.01"));
- pt.put_child("exifs", exif_array);
- std::stringstream s2;
- write_json(s2, pt);
- std::string outstr = s2.str();
- return 0;
- }
int InsertJson()
{
std::string str = "{\"code\":0,\"images\":[{\"url\":\"fmn057/20111221/1130/head_kJoO_05d9000251de125c.jpg\"},{\"url\":\"fmn057/20111221/1130/original_kJoO_05d9000251de125c.jpg\"}]}";
using namespace boost::property_tree; std::stringstream ss(str);
ptree pt;
try{
read_json(ss, pt);
}
catch(ptree_error & e) {
return 1;
} // 修改/增加一个key-value,key不存在则增加
pt.put("upid", "00001"); // 插入一个数组
ptree exif_array;
ptree array1, array2, array3;
array1.put("Make", "NIKON");
array2.put("DateTime", "2011:05:31 06:47:09");
array3.put("Software", "Ver.1.01");
exif_array.push_back(std::make_pair("", array1));
exif_array.push_back(std::make_pair("", array2));
exif_array.push_back(std::make_pair("", array3)); // exif_array.push_back(std::make_pair("Make", "NIKON"));
// exif_array.push_back(std::make_pair("DateTime", "2011:05:31 06:47:09"));
// exif_array.push_back(std::make_pair("Software", "Ver.1.01")); pt.put_child("exifs", exif_array);
std::stringstream s2;
write_json(s2, pt);
std::string outstr = s2.str(); return 0;
}
三. 两种解析库的使用经验
1. 用boost::property_tree解析字符串遇到"\/"时解析失败,而jsoncpp可以解析成功,要知道'/'前面加一个'\'是JSON标准格式。
2. boost::property_tree的read_json和write_json在多线程中使用会引起崩溃。
针对1,可以在使用boost::property_tree解析前写个函数去掉"\/"中的'\',针对2,在多线程中同步一下可以解决。
我的使用心得:使用boost::property_tree不仅可以解析json,还可以解析xml,info等格式的数据。对于解析json,使用boost::property_tree解析还可以忍受,但解析xml,由于遇到问题太多只能换其它库了。
Boost property_tree解析json的更多相关文章
- boost构造,解析json
void asynDBCenter::isGetActorInfoEx(void* on_process, const char* arg) { std::stringstream ros(arg); ...
- boost.property_tree解析xml的帮助类以及中文解析问题的解决(转)
boost.property_tree可以用来解析xml和json文件,我主要用它来解析xml文件,它内部封装了号称最快的xml解析器rapid_xml,其解析效率还是很好的.但是在使用过程中却发现各 ...
- (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
boost.property_tree可以用来解析xml和json文件,我主要用它来解析xml文件,它内部封装了号称最快的xml解析器rapid_xml,其解析效率还是很好的.但是在使用过程中却发现各 ...
- boost解析json(2)
"{ "A":1, "B":{ "C":2, "D":3 }, "E":[ {" ...
- boost解析json
#include <QtCore/QCoreApplication> #include <boost/property_tree/ptree.hpp> #include < ...
- boost::property_tree读取解析.xml文件
boost::property_tree读取解析.xml文件 1)read_xml 支持中文路径 boost::property_tree::wptree wpt; std::locale:: ...
- boost::property_tree读取解析ini文件--推荐
boost::property_tree读取解析ini文件 #include "stdafx.h" #include <iostream> #include <b ...
- C++ 中使用boost::property_tree读取解析ini文件
boost 官网 http://www.boost.org/ 下载页面 http://sourceforge.net/projects/boost/files/boost/1.53.0/ 我下载的是 ...
- 更好更快更高效解析JSON说明
现在来一个实例解析类,直接就把解析JSON到QVariant去了.唯一不足的是没有搞错误处理,具体方法也请各位自行参考json-c的发行文档,这样比较方便叙述,STL或者Boost我都没有认真接触过, ...
随机推荐
- 【MSSQL】SQL Server的日期和时间类型
参考:SQL Server的日期和时间类型 SQL Server使用 Date 表示日期,time表示时间,使用datetime和datetime2表示日期和时间. 1.秒的精度 秒的精度是指TSQL ...
- Dubbo优雅关机原理
Dubbo是通过JDK的ShutdownHook来完成优雅停机的 所以如果用户使用 kill -9 PID 等强制关闭命令,是不会执行优雅停机的 只有通过 kill PID时,才会执行 原理: · 服 ...
- appcms SSRF 绕过漏洞[转载]
漏洞 <?php if(isset($_GET['url']) && trim($_GET['url']) != '' && isset($_GET['type' ...
- HDU - 6393 Traffic Network in Numazu(树链剖分+基环树)
http://acm.hdu.edu.cn/showproblem.php?pid=6393 题意 给n个点和n条边的图,有两种操作,一种修改边权,另一种查询u到v的最短路. 分析 n个点和n条边,实 ...
- LeetCode(192. Word Frequency)
192. Word Frequency Write a bash script to calculate the frequency of each word in a text file words ...
- ArcGis辅助编号(半自动)功能的插件式实现
应邀写了一个ArcGis(ArcMap更确切一些)的辅助编号功能,其实只要想通了实现逻辑,实现的过程蛮简单的.相比挨个儿点要素写进编号或者借助“按键精灵”写入,直接操作宿主真是爽快得不能自已.无图言屌 ...
- Js点击按钮下载文件到本地(兼容多浏览器)
实现点击 用纯 js(非jquery) 下载文件到本地 自己尝试,加网上找了好久未果,如: window.open(url) location.href=url form表单提交 ifr ...
- ue4 socket
Socket 地址: TSharedRef<FInternetAddr> internetAddr = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSY ...
- 4-24日 collections模块 random模块 time模块 sys模块 os模块
1, collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdi ...
- mysql报错:Cause: com.mysql.jdbc.PacketTooBigException
报错信息: Error updating database. Cause: com.mysql.jdbc.PacketTooBigException: Packet for query is too ...