json的嵌套解析C++类实现

来源:互联网 发布:税控盘安装软件 编辑:程序博客网 时间:2024/06/10 02:21

  • rapidjson简介
  • 库的使用
  • 代码
  • 注意事项

1.rapidjson简介

RapidJSON 是腾讯开源库。
RapidJSON 是一个 C++ 的 JSON 解析器及生成器。它的灵感来自 RapidXml。
RapidJSON 小而全。它同时支持 SAX 和 DOM 风格的 API。SAX 解析器只有约 500 行代码。
RapidJSON 快。它的性能可与 strlen() 相比。可支持 SSE2/SSE4.2 加速。
RapidJSON 独立。它不依赖于 BOOST 等外部库。它甚至不依赖于 STL。
RapidJSON 对内存友好。在大部分 32/64 位机器上,每个 JSON 值只占 16 字节(除字符串外)。它预设使用一个快速的内存分配器,令分析器可以紧凑地分配内存。
RapidJSON 对 Unicode 友好。它支持 UTF-8、UTF-16、UTF-32 (大端序/小端序),并内部支持这些编码的检测、校验及转码。例如,RapidJSON 可以在分析一个 UTF-8 文件至 DOM 时,把当中的 JSON 字符串转码至 UTF-16。它也支持代理对(surrogate pair)及 “\u0000”(空字符)。

rapidjson库官网地址:http://www.oschina.net/news/61812/rapidjson-1-0-final
rapidjson库下载网地址:https://github.com/miloyip/rapidjson
rapidjson库安装及使用教程中文解释网站:http://rapidjson.org/zh-cn/

2.库的使用

1.从https://github.com/miloyip/rapidjson下载rapidjson-master.zip。
2.用如下命令解压:
[root@lc work]#unzip rapidjson-master.zip
3.将./rapidjson-master/include复制到你要编写代码的地方即可,不需要链接库。

3.代码

  • 3.1需要解析的http_im.json 文件

    //http_im.json {"im":[    {        "domains":        [            {"host":"common.diditaxi.com.cn","uri":"/app/tracelog"},            {"host":"conf.diditaxi.com.cn","uri":"/api/widgets"},            {"host":"api.udache.com","uri":"/gulfstream/api/"},            {"host":"car.xiaojukeji.com","uri":"/api/main"}        ]    }]}
  • 3.2 myjson.h 头文件

    #include "rapidjson/document.h"#include <iostream>#include <fstream>using namespace rapidjson;using namespace std;class myParserJson{public:    myParserJson(const string& filename);    ~myParserJson();    bool myParser();    Value& getHttpObject();    Value& getImObject();private:    ifstream m_ifs;    Document m_doc;};
  • 3.3 myjson.cpp 实现文件

    #include "myjson.h"myParserJson::myParserJson(const string& filename):m_doc(NULL){    m_ifs.open(filename.c_str());}myParserJson::~myParserJson(){    m_ifs.close();}Value& myParserJson::getHttpObject(){    return m_doc["http"];}Value& myParserJson::getImObject(){    return m_doc["im"];}bool myParserJson::myParser(){    string mystream,line;    if(!m_ifs){        cout<<"open file error!"<<endl;        return false;    }    while(getline(m_ifs, line)){        mystream.append(line+"\n");    }    m_doc.Parse(mystream.c_str());    assert(m_doc.IsObject());    if(m_doc.HasParseError()){        ParseErrorCode code = m_doc.GetParseError();        return false;    }    Value& content = m_doc["im"];   //im    assert(content.IsArray());    for(SizeType i = 0;i<content.Size();++i){        Value& v1 = content[i];         // {}        assert(v1.IsObject());        if(v1.HasMember("domains")){            Value& v2 = v1["domains"];            //assert(v2.IsArray()); //如果有相同名字的domains,有些却不是数组的时候不能用断言宏            if(v2.IsArray()){                for(SizeType i = 0;i<v2.Size();++i){                    Value& v3 = v2[i];                      if(v3.HasMember("host")){                        cout<<"host:"<<v3["host"].GetString()<<endl;                    }                }                   }        }    }}   
  • 3.4 main.cpp

    #include "myjson.h"int main(){    string filename = "http_im.json";    myParserJson mj(filename.c_str());    bool flag = mj.myParser();    if(flag)        cout<<"parser success!"<<endl;    return 0;}

4.注意事项

在嵌套解析json时候,要注意是否名字相同但是却不是同类型的,例如domains,有的它是数组,有的它是object时候,不能用assert()断言宏,否则会报错!!!自己亲身实践了才知道。。。

原创粉丝点击