zoukankan      html  css  js  c++  java
  • C++通过JsonCpp读取Json文件

    一:下载Jsoncpp库

    https://sourceforge.net/projects/jsoncpp/

    下载源码解压之后得到jsoncpp-src-0.5.0文件夹:

    我们只需要jsoncpp的头文件和cpp文件。

    其中jsonscpp的头文件位于jsoncpp-src-0.5.0includejson:

    jsoncpp的cpp文件位于jsoncpp-src-0.5.0srclib_json:

    将头文件目录和源文件目录拷贝到项目根目录下(都位于根目录):

    其中json头文件目录不能修改名称,因为后面源文件引用格式<json/...>,lib_json源文件可以修改(也可以不用修改)

    项目编译命令:

    g++ readJsonStr.cpp ./lib_json/*.cpp -I ./ -o main

    其中readJsonStr.cpp与./lib_json/*.cpp都是需要编译的文件,然后使用-I指定头文件所在的根目录位置,-o输出执行文件

    二:从字符串中读取Json数据 

    #include <string>
    #include <json/json.h>
    #include <iostream>
    #include <fstream>
    #include <typeinfo> //判断类型
    #include <vector>
    
    using namespace std;
    
    void readStrJson(); //从字符串中读取Json数据(简单Json格式)
    void readStrProJson(); //同样从字符串中读取Json数据(Json格式更加复杂)
    
    int main(int argc,char* argv)
    {
        cout<<"sample case:"<<endl;
        readStrJson();
        cout<<"complex case:"<<endl;
        readStrProJson();
    
        return 0;
    }

    (一)基础数据类型读取

    void readStrJson()
    {
        //字符串  -----  注意:使用""作为换行也可以,实际写成一行也可以"{"praenomen":"Gaius","nomen":"Julius","cognomen":"Caezar","born":-100,"died":-44}"; 
        const char* str =   
          "{"praenomen":"Gaius","
          ""nomen":"Julius","cognomen":"Caezar","
          ""born":-100,"died":-44}";  
    
        /* 
        //json内容如下: key:val其中val为字符串、数字等基础类型
        { 
            "praenomen":"Gaius", 
            "nomen":"Julius", 
            "cognomen":"Caezar", 
            "born":-100, 
            "died":-44  
        } 
        */
    
        Json::Reader reader; //用于读取字符串
        Json::Value root; //用于存放结果到map中
        if(reader.parse(str,root))
        {
            string praenomen = root["praenomen"].asString();
            string nomen = root["nomen"].asString();
            string cognomen = root["cognomen"].asString();
            int born = root["born"].asInt();
            int died = root["died"].asInt();
            //cout<<root["born"]<<typeid(root["born"]).name()<<endl; //封装为了一个对象N4Json5ValueE
            cout<<praenomen+" "+nomen+" "+cognomen<<" was born in year "<< born
            <<", died in year "<<died<<endl;
        }
    }

    (二)复合数据类型读取

    void readStrProJson()
    {
        string strValue = "{"name":"json","array":[{"cpp":"jsoncpp"},{"java":"jsoninjava"},{"php":"support"}]}";  
        /* 
        //json内容如下: 
        { 
        "name": "json″, 
        "array": [ 
            { 
                "cpp": "jsoncpp" 
            }, 
            { 
                "java": "jsoninjava" 
            }, 
            { 
                "php": "support" 
            } 
        ] 
        } 
        */  
        Json::Reader reader;
        Json::Value root;
    
        if(reader.parse(strValue,root))
        {
            string name = root["name"].asString();
            cout<<name<<endl;
            const Json::Value arrayObj = root["array"];
            //cout<<typeid(arrayObj).name()<<endl; //N4Json5ValueE
    
            for(unsigned int i=0;i<arrayObj.size();i++){
                if(arrayObj[i].isMember("cpp")) //是查找内部是否有这个key
                    cout<<"key is Cpp"<<endl;
                //cout<<typeid(arrayObj[i]).name()<<endl; //N4Json5ValueE
                vector<string> mems = arrayObj[i].getMemberNames(); //获取所有keys
                for(unsigned int j=0;j<mems.size();j++){
                    cout<<mems[j]<<":"<<arrayObj[i][string(mems[j])];
                }
            }
        }
    }

    三:从Json文件中读取数据

    #include <string>
    #include <json/json.h>
    #include <iostream>
    #include <fstream>
    #include <vector>
    
    using namespace std;
    
    void readFileJson(); //从文件中读取Json
    
    int main(int argc,char* argv[])
    {
        readFileJson();
        return 0;
    }
    
    /*
    文件内容:
    {  
        "name":"Mike Jiang",  
        "age":23,  
        "sex_is_male":true,  
        "partner":  
        {  
            "partner_name":"Galatea",  
            "partner_age":21,  
            "partner_sex_is_male":false  
        },  
        "achievement":["ach1","ach2","ach3"]  
    }  
    */
    
    void readFileJson()
    {
        Json::Reader reader;
        Json::Value root;
    
        ifstream in("test.json",ios::binary);
    
        if(!in.is_open()){
            cout<<"Error opening"<<endl;
            return;
        }
    
        if(reader.parse(in,root)){
            string name = root["name"].asString();
            int age = root["age"].asInt();
            bool sexIsM = root["sex_is_male"].asBool();
    
            cout<<"My name is "<<name<<endl;
            cout<<"I`m "<<age<<endl;
            cout<<"I`m a"<<(sexIsM?"man":"woman")<<endl;
    
            //读取子节点--字典
            const Json::Value partner = root["partner"];
            vector<string> keys = partner.getMemberNames();
            for(unsigned int i=0;i<keys.size();i++){
                cout<<partner[keys[i]];
            }
            //读取子节点--列表
            const Json::Value achievement = root["achievement"];
            for(unsigned int i=0;i<achievement.size();i++){
                cout<<achievement[i].asString()<<endl;
            }
    
        }
    
        in.close();
    }

    四:写入Json数据到文件中

    #include <string>
    #include <json/json.h>
    #include <iostream>
    #include <fstream>
    #include <vector>
    
    using namespace std;
    
    /* 
    //json文件内容如下: 
    { 
        "achievement" : [ "ach1", "ach2", "ach3" ], 
        "age" : 23, 
        "name" : "Mike Jiang", 
        "partner" : { 
            "partner_age" : 21, 
            "partner_name" : "Galatea", 
            "partner_sex_is_male" : false 
        }, 
        "sex_is_male" : true 
    } 
    */
    
    void writeFileJson();//将信息保存为JSON格式 
    
    int main(int argc,char* argv[])
    {
        writeFileJson();
        return 0;
    }
    
    void writeFileJson()
    {
        //根节点
        Json::Value root;
    
        root["name"] = Json::Value("Mike Jiang");
        root["age"] = Json::Value(23);
        root["sex_is_male"] = Json::Value(false);
    
        //子节点
        Json::Value partner;
    
        partner["partner_name"] = Json::Value("Galatea");
        partner["partner_age"] = Json::Value(21);
        partner["partner_sex_is_male"] = Json::Value(false);
    
        //子节点挂到父节点
        root["partner"] = Json::Value(partner);
    
        //数组形式
        root["achievement"].append("ach1");
        root["achievement"].append("ach2");
        root["achievement"].append("ach3");
    
        //两种输出形式---这里直接输出
        //1.直接输出
        cout<<"Fast Writer:"<<endl;
        Json::FastWriter fw;
        cout<<fw.write(root)<<endl;
    
        //2.缩进输出
        cout<<"Styled Writer:"<<endl;
        Json::StyledWriter sw;
        cout<<sw.write(root)<<endl;
    
        //----开始输出到文件(将使用缩进格式)
        ofstream os;
        os.open("demo2.json");
        os<<sw.write(root);
        os.close();
    }

  • 相关阅读:
    重学Java 面向对象 之 final
    java并发学习04---Future模式
    java并发学习03---CountDownLatch 和 CyclicBarrier
    java并发学习02---ReadWriteLock 读写锁
    java并发学习01 --- Reentrantlock 和 Condition
    链表的倒数第k个节点
    重建二叉树
    java并发学习--线程池(一)
    二叉树的深度
    vue-常用指令(v-for)
  • 原文地址:https://www.cnblogs.com/ssyfj/p/14011014.html
Copyright © 2011-2022 走看看