C++操作json数据

一、下载jsoncpp

​         首先到如下地址下载jsoncpp源码;https://sourceforge.net/projects/jsoncpp/

        下载完成后解压缩得到如下文件夹:

二、环境配置

​         新建一个测试工程,默认打印helloWorld;

        将jsoncpp-src-0.5.0文件夹复制到工程目录下;

        以源码方式引用jsoncpp,便于管理新建一个json筛选器,并将..\jsoncpp-src-0.5.0\include\json和jsoncpp-src-0.5.0\src\lib_json两个目录里的文件添加到筛选器下:

         右键项目属性,在C/C++/常规/附加包含目录下,添加.\jsoncpp-src-0.5.0\include目录;

         将三个cpp文件的属性设置为不使用预编译头;

三、效果测试

        使用时添加#include "json/json.h"即可,此处以封装json数据为string为例:

四、C++操作json方法       

        首先定义一个json数据格式:

{
"name" : "xiaohuoche"
"age" : 9
"major" : [ "math", "physics"]
“friends” : [
         {
            “friend_name” :	"xiaoshuai"
            “friend_age”  :	8
            "friend_major" : "sing"
         },
         {
            “friend_name” :	"xiaomei"
            “friend_age”  :	6
            "friend_major" : "dance"
         },
    ]
}

4.1 封装json数据为string

std::string WJsonWork::DataToJson()
{
    Json::FastWriter writerinfo;
    Json::Value  writevalueinfo;

    writevalueinfo["name"] = "xiaohuoche";
    writevalueinfo["age"] = 9;
    writevalueinfo["major"].append("math");
    writevalueinfo["major"].append("physics");

    Json::Value  writedata1;
    writedata1["friend_name"] = "xiaoshuai";
    writedata1["friend_age"] = 8;
    writedata1["friend_major"] = "sing";
    writevalueinfo["friends"].append(writedata1);

    Json::Value  writedata2;
    writedata2["friend_name"] = "xiaomei";
    writedata2["friend_age"] = 6;
    writedata2["friend_major"] = "dance";
    writevalueinfo["friends"].append(writedata2);
    
    std::string strEmail = writerinfo.write(writevalueinfo);
    
    //缩进输出  
    Json::StyledWriter sw;
    cout << sw.write(writevalueinfo) << endl << endl;
    
    return strEmail;
}

打印结果如下:

4.2 从string中解析json数据

void WJsonWork::ReadJsonStr(string strData)
{
    Json::Reader reader;
    Json::Value value;

    if (reader.parse(strData, value))
    {
        string name = value["name"].asString();
        cout << "name:" << name << endl;

        int age = value["age"].asInt();
        cout << "age:" << age << endl;

        const Json::Value arrayObj1 = value["major"];
        for (unsigned int i = 0; i < arrayObj1.size(); i++)
        {
            string major = arrayObj1[i].asString();
            cout << "major:" << major << endl;
        }

        const Json::Value arrayObj2 = value["friends"];
        for (unsigned int i = 0; i < arrayObj2.size(); i++)
        {
            string friend_name = arrayObj2[i]["friend_name"].asString();
            int friend_age = arrayObj2[i]["friend_age"].asInt();
            string friend_major = arrayObj2[i]["friend_major"].asString();
            cout << "friend_name:" << friend_name <<"\t"
                 << "friend_age:" << friend_age << "\t"
                 << "friend_major:" << friend_major << endl;
        }
    }
}

打印结果如下:

 4.3 写入本地json文件

void WJsonWork::writeJsonFile()
{
    //根节点  
    Json::Value root;
    //根节点属性  
    root["name"] = Json::Value("xiaohuoche");
    root["age"] = Json::Value(9);
    //根节点属性 :数组形式  
    root["major"].append("math");
    root["major"].append("physics");

    //子节点1  
    Json::Value friends1;
    //子节点属性  
    friends1["friend_name"] = Json::Value("xiaoshuai");
    friends1["friend_age"] = Json::Value(8);
    friends1["friend_major"] = Json::Value("sing");
    //子节点挂到根节点上  
    root["friends"].append(friends1);

    //子节点2
    Json::Value friends2;
    //子节点属性  
    friends2["friend_name"] = Json::Value("xiaomei");
    friends2["friend_age"] = Json::Value(6);
    friends2["friend_major"] = Json::Value("dance");
    //子节点挂到根节点上  
    root["friends"].append(friends2);

    //输出到文件  
    Json::StyledWriter sw;
    ofstream os;
    os.open("test.json", std::ios::out | std::ios::app);
    if (!os.is_open())
         cout << "error:can not find or create the file which named \" demo.json\"." << endl;
    os << sw.write(root);
    os.close();
}

本地结果如下:

4.4 解析本地json文件

void WJsonWork::readJsonFile()
{
    Json::Reader reader;
    Json::Value root;

    //从文件中读取,保证当前文件有demo.json文件  
    ifstream in("test.json", ios::binary);

    if (!in.is_open())
    {
        cout << "Error opening file\n";
        return;
    }

    if (reader.parse(in, root))
    {
        //读取根节点信息  
        string name = root["name"].asString();
        cout << "name:" << name << endl;
        int age = root["age"].asInt();
        cout << "age:" << age << endl;
        cout << "major:\t";
        //读取根节点数组信息  
        for (unsigned int i = 0; i < root["major"].size(); i++)
        {
            string ach = root["major"][i].asString();
            cout << ach << '\t';
        }
        cout << '\n';

        //读取子节点数组信息  
        for (unsigned int i = 0; i < root["friends"].size(); i++)
        {
            string ach = root["friends"][i]["friend_name"].asString();
            cout << "friend_name:" << ach << '\n';
            int age = root["friends"][i]["friend_age"].asInt();
            cout << "friend_age:" << age << '\n';
            ach = root["friends"][i]["friend_major"].asString();
            cout << "friend_major:" << ach << '\n';
        }
    }
    else
    {
        cout << "parse error\n" << endl;
    }
    in.close();
}

打印结果如下:

五、参考资料

https://blog.csdn.net/u011261430/article/details/77713299?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167365679916800182751024%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=167365679916800182751024&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-3-77713299-null-null.142^v71^insert_chatgpt,201^v4^add_ask&utm_term=c%2B%2B%20%20json&spm=1018.2226.3001.4187​​​​​​​

https://blog.csdn.net/shuiyixin/article/details/89330529?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167583625216800184161844%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=167583625216800184161844&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-89330529-null-null.142^v73^insert_down1,201^v4^add_ask,239^v1^insert_chatgpt&utm_term=c%2B%2Bjson&spm=1018.2226.3001.4187

https://blog.51cto.com/ives/5522437

https://blog.csdn.net/ouyangfushu/article/details/84993791?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167521636316800184180354%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=167521636316800184180354&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-4-84993791-null-null.142^v72^insert_chatgpt,201^v4^add_ask&utm_term=VS%E7%BC%96%E8%AF%91jsoncpp&spm=1018.2226.3001.4187

  • 4
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值