使用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

解析一段下面的数据:

  1. {
  2. "code": 0,
  3. "images":
  4. [
  5. {
  6. "url": "fmn057/20111221/1130/head_kJoO_05d9000251de125c.jpg"
  7. },
  8. {
  9. "url": "fmn057/20111221/1130/original_kJoO_05d9000251de125c.jpg"
  10. }
  11. ]
  12. }
{
"code": 0,
"images":
[
{
"url": "fmn057/20111221/1130/head_kJoO_05d9000251de125c.jpg"
},
{
"url": "fmn057/20111221/1130/original_kJoO_05d9000251de125c.jpg"
}
]
}
  1. int ParseJson()
  2. {
  3. std::string str = "{\"code\":0,\"images\":[{\"url\":\"fmn057/20111221/1130/head_kJoO_05d9000251de125c.jpg\"},{\"url\":\"fmn057/20111221/1130/original_kJoO_05d9000251de125c.jpg\"}]}";
  4. using namespace boost::property_tree;
  5. std::stringstream ss(str);
  6. ptree pt;
  7. try{
  8. read_json(ss, pt);
  9. }
  10. catch(ptree_error & e) {
  11. return 1;
  12. }
  13. try{
  14. int code = pt.get<int>("code");   // 得到"code"的value
  15. ptree image_array = pt.get_child("images");  // get_child得到数组对象
  16. // 遍历数组
  17. BOOST_FOREACH(boost::property_tree::ptree::value_type &v, image_array)
  18. {
  19. std::stringstream s;
  20. write_json(s, v.second);
  21. std::string image_item = s.str();
  22. }
  23. }
  24. catch (ptree_error & e)
  25. {
  26. return 2;
  27. }
  28. return 0;
  29. }
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

  1. int InsertJson()
  2. {
  3. std::string str = "{\"code\":0,\"images\":[{\"url\":\"fmn057/20111221/1130/head_kJoO_05d9000251de125c.jpg\"},{\"url\":\"fmn057/20111221/1130/original_kJoO_05d9000251de125c.jpg\"}]}";
  4. using namespace boost::property_tree;
  5. std::stringstream ss(str);
  6. ptree pt;
  7. try{
  8. read_json(ss, pt);
  9. }
  10. catch(ptree_error & e) {
  11. return 1;
  12. }
  13. // 修改/增加一个key-value,key不存在则增加
  14. pt.put("upid", "00001");
  15. // 插入一个数组
  16. ptree exif_array;
  17. ptree array1, array2, array3;
  18. array1.put("Make", "NIKON");
  19. array2.put("DateTime", "2011:05:31 06:47:09");
  20. array3.put("Software", "Ver.1.01");
  21. exif_array.push_back(std::make_pair("", array1));
  22. exif_array.push_back(std::make_pair("", array2));
  23. exif_array.push_back(std::make_pair("", array3));
  24. //   exif_array.push_back(std::make_pair("Make", "NIKON"));
  25. //   exif_array.push_back(std::make_pair("DateTime", "2011:05:31 06:47:09"));
  26. //   exif_array.push_back(std::make_pair("Software", "Ver.1.01"));
  27. pt.put_child("exifs", exif_array);
  28. std::stringstream s2;
  29. write_json(s2, pt);
  30. std::string outstr = s2.str();
  31. return 0;
  32. }
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的更多相关文章

  1. boost构造,解析json

    void asynDBCenter::isGetActorInfoEx(void* on_process, const char* arg) { std::stringstream ros(arg); ...

  2. boost.property_tree解析xml的帮助类以及中文解析问题的解决(转)

    boost.property_tree可以用来解析xml和json文件,我主要用它来解析xml文件,它内部封装了号称最快的xml解析器rapid_xml,其解析效率还是很好的.但是在使用过程中却发现各 ...

  3. (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决

    boost.property_tree可以用来解析xml和json文件,我主要用它来解析xml文件,它内部封装了号称最快的xml解析器rapid_xml,其解析效率还是很好的.但是在使用过程中却发现各 ...

  4. boost解析json(2)

    "{ "A":1, "B":{ "C":2, "D":3 }, "E":[ {" ...

  5. boost解析json

    #include <QtCore/QCoreApplication> #include <boost/property_tree/ptree.hpp> #include < ...

  6. boost::property_tree读取解析.xml文件

    boost::property_tree读取解析.xml文件 1)read_xml 支持中文路径  boost::property_tree::wptree wpt;    std::locale:: ...

  7. boost::property_tree读取解析ini文件--推荐

    boost::property_tree读取解析ini文件 #include "stdafx.h" #include <iostream> #include <b ...

  8. C++ 中使用boost::property_tree读取解析ini文件

    boost 官网 http://www.boost.org/ 下载页面 http://sourceforge.net/projects/boost/files/boost/1.53.0/ 我下载的是  ...

  9. 更好更快更高效解析JSON说明

    现在来一个实例解析类,直接就把解析JSON到QVariant去了.唯一不足的是没有搞错误处理,具体方法也请各位自行参考json-c的发行文档,这样比较方便叙述,STL或者Boost我都没有认真接触过, ...

随机推荐

  1. 面向对象【day08】:类的起源与metaclass(二)

    本节内容 1.概述 2.类的起源 3.__new__方法 4.__metaclass__方法 一.概述 前面我们学习了大篇幅的关于类,通过类创建对象,那我们想知道这个类到底是怎么产生的呢?它的一切来源 ...

  2. layui(八)——轮播图常见用法总结

    carousel 是 layui 2.0 版本中新增的全新模块,主要适用于跑马灯/轮播等交互场景.它可以满足任何类型内容的轮播式切换操作,更可以胜任 FullPage (全屏上下轮播)的需求,简洁而不 ...

  3. Bootstrap模态框修改出现的位置和大小

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  4. IP简介(一)

    1. OSI模型 TCP是TCP/IP的第三层传输层,对应OSI的第四层传输层: IP是TCP/IP的第二层互联层,对应OSI的第三层网络层. TCP属于OSI中的运输层它是面向连接的协议: IP属于 ...

  5. jquery遇到的问题

    1.关于$.fn $.fn是指jquery的命名空间,加上fn上的方法及属性,会对jquery实例每一个有效. 如扩展$.fn.abc(),即$.fn.abc()是对jquery扩展了一个abc方法, ...

  6. redis基本操作

    ''' pip install redis redis 可以看成内存中的大字典 redis五大数据类型 --> 指的是第一层的value值的类型 - 字符串 "k1" - 列 ...

  7. 使用二分查找判断某个数在某个区间中--如何判断某个IP地址所属的地区

    一,问题描述 给定100万个区间对,假设这些区间对是互不重叠的,如何判断某个数属于哪个区间? 首先需要对区间的特性进行分析:区间是不是有序的?有序是指:后一个区间的起始位置要大于前一个区间的终点位置. ...

  8. 开源框架.netCore DncZeus学习(四)项目升级

    今天发现开源代码从1.0.0.1升级到了1.0.1.0,主要去掉了id主键,升级办法打开DncZeus,右键Git Bash Here,输入以下命令 合并失败,因为上一节尝试修改了几个代码,解决办法 ...

  9. 开源框架.netCore DncZeus学习(一)npm安装

    今天看到一个不错的开源项目DncZeus, https://github.com/lampo1024/DncZeus 整个界面挺漂亮,而且权限做到了按钮级别,功能也较容易扩展,刚好学习VUE纯看文章很 ...

  10. webpack学习笔记——打包js

    1.新建一个入口js文件,如entry.js,代码如下: document.write("It works.") 2.然后编译 entry.js 并打包到 bundle.js(会自 ...