自学内容网 自学内容网

网易博客旧文----boost学习之json格式的解析

boost学习之json格式的解析
2013-07-04 15:36:25| 分类: boost | 标签: |举报 |字号大中小 订阅

据百度百科: Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一。
从今天开始需要学习boost的使用了,这么好的的一个库,不用而自己重复写一些功能类似的代码太没有意思了。

从网站boost官网下载最新版本为1.54
解压到C盘,目录为C:\boost_1_54_0

打开VS2008,在搜索头文件目录中增加这个路径C:\boost_1_54_0
boost学习之json格式的解析 - xzhoumin - MMZHOU的博客

因为喜欢使用编译源代码方式,因此没有将boost编译成库的方式,喜欢用库的可以在网上找一下编译成库的方法,也很简单的。

新建一个控制台程序用于测试
根据需要增加需要的头文件,例如:
#include <boost/progress.hpp>
#include “sstream”
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <boost/property_tree/xml_parser.hpp>
#include <boost/typeof/typeof.hpp>
#include <boost/foreach.hpp>

// utf8转换用
#include <boost/program_options/detail/convert.hpp>
#include <boost/program_options/detail/utf8_codecvt_facet.hpp>

// 包含源代码(注意目录,在libs下,不是boost下),这样就不用库了,和前面的#define BOOST_ALL_NO_LIB配合使用
#include <libs/program_options/src/utf8_codecvt_facet.cpp>

一、从内存读取内容并解析
istringstream jsonIStream;
char *buf = “{“key1”:“value1”,“array”:[{“key2”:“value2”},{“key2”:“value3”},{“key2”:“value4”}]}”;
jsonIStream.str(buf);
cout<<jsonIStream.str()<<endl;

property_tree::ptree ptParse;
property_tree::json_parser::read_json(jsonIStream,ptParse);

cout<<"key1="<<ptParse.get<string>("key1")<<endl;

二、从文件读取内容并解析
// asc格式文件
property_tree::json_parser::read_json(“c:/test/json.txt”,ptParse);

文件json.txt格式为asc,内容为:
{“key1”:“value1”,“array”:[{“key2”:“value2”},{“key2”:“value3”},{“key2”:“value4”}]}

property_tree::wptree wptParse;
std::locale oldLocale;
std::locale utf8Locale(oldLocale,
new boost::program_options::detail::utf8_codecvt_facet());
property_tree::json_parser::read_json(“c:/test/json_utf8.txt”,wptParse,utf8Locale);

json_utf8.txt格式为utf8无bom,有bom的boost无法解析,内容为:
{“key1”:“value1”,“array”:[{“key2”:“value2”},{“key2”:“value3”},{“key2”:“value4”}]}

三、获取数组内容
1、asc格式的,一共3种方式,都很类似
// 第一种

property_tree::ptree pChild = ptParse.get_child("array");
for (property_tree::ptree::iterator it = pChild.begin(); it != pChild.end(); ++it)
{
cout<<it->first;
cout<<it->second.get<string>("key2")<<",";
}
// 第二种
BOOST_AUTO(child, ptParse.get_child("array"));
for (BOOST_AUTO(pos, child.begin());pos!=child.end();++pos)
{
cout<<pos->second.get<string>("key2")<<",";
}
cout<<endl;

cout<<"array="<<ptParse.get<string>("array")<<endl;
// 第三种
BOOST_FOREACH(property_tree::ptree::value_type &v,ptParse.get_child("array"))  
{  
property_tree::ptree& childparse = v.second;
cout<<childparse.get<string>("key2")<<",";
}
cout<<endl;

2、utf8格式的

wcout<<_T("key1=")<<wptParse.get<wstring>(_T("key1"))<<endl;
// 第一种
BOOST_AUTO(wchild, wptParse.get_child(_T("array")));
for (BOOST_AUTO(pos, wchild.begin());pos!=wchild.end();++pos)
{
wcout<<pos->second.get<wstring>(_T("key2"))<<_T(",");
}
cout<<endl;

// 第二种
wcout<<_T("array=")<<wptParse.get<wstring>(_T("array"))<<endl;
BOOST_FOREACH(property_tree::wptree::value_type &v,wptParse.get_child(_T("array")))  
{  
property_tree::wptree& childparse = v.second;
wcout<<childparse.get<wstring>(_T("key2"))<<_T(",");
}
cout<<endl;

工程例子及例子文件下载:
下载链接


原文地址:https://blog.csdn.net/XZHOUMIN/article/details/143612526

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!