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();
}

原文地址:https://www.cnblogs.com/ssyfj/p/14011014.html