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我都没有认真接触过, ...
随机推荐
- [JUC-1]并发包实现及线程状态
一.Java 并发包实现 二.Java 线程状态转换图
- 开源的,跨平台的.NET机器学习框架ML.NET
微软在Build 2018大会上推出的一款面向.NET开发人员的开源,跨平台机器学习框架ML.NET. ML.NET将允许.NET开发人员开发他们自己的模型,并将自定义ML集成到他们的应用程序中,而无 ...
- blackeye部署
部署: apt-get install php apt-get install libapache2-mod-php apt-get install git git clone https://git ...
- [leetcode-118]Pascal's triangle 杨辉三角
Pascal's triangle (1过) Given numRows, generate the first numRows of Pascal's triangle. For example, ...
- bzoj千题计划308:bzoj4589: Hard Nim(倍增FWT+生成函数)
https://www.lydsy.com/JudgeOnline/problem.php?id=4589 n*m*m 做法 dp[i][j] 前i堆石子,异或和为j的方案数 第一重循环可以矩阵快速幂 ...
- windows server 2008 r2 负载平衡 找不到主机 解决方案
在C:\Windows\System32\drivers\etc文件夹中的host文件里手工将主机名WIN-********解析至IP 即可.
- python模块之自定义模块
模块概述 到此之前,我们都是在一个py文件里操作,接下来,我们学习模块的内容,可以从其他文件引入内容(如函数等) 1. 什么是模块 一个py文件就是一个模块,模块是一些相似功能的集合体 2. 为什么要 ...
- Java中的按位运算
博客大搬家. 一.位运算符简介: 1.按位与&.如果两个整形数据 a.b 对应位都是1,则结果位才为1,否则为0,(int 最大值0x7fffffff ): int a = 0x7ffffff ...
- es6写法
我们在日常开发中,如果我们使用es5则可以直接在浏览器里面写JavaScript脚本.一点问题也没有. 但是在写es6语法的JavaScript代码的时候,我们就需要引入babel翻译器了. 例如: ...
- Python之进程 3 - 进程池和multiprocess.Poll
一.为什么要有进程池? 在程序实际处理问题过程中,忙时会有成千上万的任务需要被执行,闲时可能只有零星任务.那么在成千上万个任务需要被执行的时候,我们就需要去创建成千上万个进程么?首先,创建进程需要消耗 ...