C++通過JsonCpp讀取Json文件


一:下載Jsoncpp庫

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

下載源碼解壓之后得到jsoncpp-src-0.5.0文件夾:

我們只需要jsoncpp的頭文件和cpp文件。

其中jsonscpp的頭文件位於jsoncpp-src-0.5.0\include\json:

jsoncpp的cpp文件位於jsoncpp-src-0.5.0\src\lib_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();
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM