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

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()断言宏,否则会报错!!!自己亲身实践了才知道。。。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中,使用正则表达式封装解析JSON工具可以方便地解析JSON格式的字符串。下面是一个简单的例子: ```cpp #include <iostream> #include <regex> #include <string> #include <vector> #include <map> class JsonParser { public: JsonParser() {} std::map<std::string, std::string> parse(std::string jsonStr) { std::map<std::string, std::string> jsonMap; std::regex reg("\"(.*?)\":\"(.*?)\""); // 匹配 key:value 的正则表达式 std::sregex_iterator it(jsonStr.begin(), jsonStr.end(), reg); std::sregex_iterator end; while (it != end) { std::smatch match = *it; jsonMap[match.str(1)] = match.str(2); ++it; } return jsonMap; } }; int main() { std::string jsonStr = "{\"name\":\"Tom\",\"age\":\"20\",\"address\":\"Shanghai\"}"; JsonParser parser; std::map<std::string, std::string> jsonMap = parser.parse(jsonStr); for (auto &p : jsonMap) { std::cout << p.first << ": " << p.second << std::endl; } return 0; } ``` 在上面的代码中,我们定义了一个`JsonParser`,并实现了`parse`方法来解析JSON格式的字符串。在`parse`方法中,我们使用了正则表达式来匹配JSON字符串中的`key:value`键值对,并将其存入一个`map`中。最后,我们可以遍历这个`map`来输出解析结果。 需要注意的是,这里只是一个简单的例子,实际的JSON解析工具可能需要处理更复杂的JSON格式,例如嵌套JSON对象或数组。因此,我们需要更复杂的正则表达式来匹配这些格式,并编写更复杂的代码来解析它们。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值