专栏首页转载gongluck的CSDN博客C++通过jsoncpp类库读写JSON文件

C++通过jsoncpp类库读写JSON文件

JSON是一个轻量级的数据定义格式,比起XML易学易用,而扩展功能不比XML差多少,用之进行数据交换是一个很好的选择。JSON的全称为:JavaScript Object Notation ,顾名思义,JSON是用于标记javascript对象的,详情参考http://www.json.org/。

本教程选择第三方库jsoncpp来解析json, jsoncpp是比较出名的c++解析库,在json官网也是首推的。

jsoncpp下载地址:http://download.csdn.net/detail/tennysonsky/

下载源码解压之后得到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目录中所对应的.cpp里面包含头文件形式是这样:#include <json/xxx.h>。

lib_json:json操作所需的cpp文件,此文件夹名字可根据需要自行命名。

把json和lib_json拷贝出来放在你需要编写代码的目录中(注意:json 和 lib_json 要在同一级目录):

编译代码时,需要把lib_json目录中的cpp文件加入编译条件中:

1)从字符串中读取JSON

#include <string>

#include <json/json.h>

#include <iostream>

#include <fstream>

using namespace std;



void readStrJson(); //从字符串中读取JSON

void readStrProJson(); //从字符串中读取JSON(内容复杂些)



int main(int argc, char *argv[]) 

{

        readStrJson();

 

        cout << "\n\n";

        readStrProJson();

 

        return 0;

}



//从字符串中读取JSON

void readStrJson() 

{

        //字符串

  const char* str = 

      "{\"praenomen\":\"Gaius\",\"nomen\":\"Julius\",\"cognomen\":\"Caezar\","

      "\"born\":-100,\"died\":-44}";

 

  /*

  //json内容如下:

  {

                "praenomen":"Gaius",

                "nomen":"Julius",

                "cognomen":"Caezar",

                "born":-100,

                "died":-44 

        }

  */



  Json::Reader reader;

  Json::Value root;



  //从字符串中读取数据

  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 << praenomen + " " + nomen + " " + cognomen

          << " was born in year " << born 

          << ", died in year " << died << endl;

  }

 

}



//从字符串中读取JSON(内容复杂些)

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 value;



        if (reader.parse(strValue, value))

        {

                string out = value["name"].asString();

                cout << out << endl;

                const Json::Value arrayObj = value["array"];

                for (unsigned int i = 0; i < arrayObj.size(); i++)

                {

                        if (!arrayObj[i].isMember("cpp")) 

                                continue;

                        out = arrayObj[i]["cpp"].asString();

                        cout << out;

                        if (i != (arrayObj.size() - 1))

                                cout << endl;

                }

        }

}

编译运行结果如下:

2)从文件中读取JSON


#include <string>

#include <json/json.h>

#include <iostream>

#include <fstream>

using namespace std;



void readFileJson(); //从文件中读取JSON,一个存储了JSON格式字符串的文件



int main(int argc, char *argv[]) 

{

        readFileJson();

 

        return 0;

}



//从文件中读取JSON

void readFileJson()

{

        Json::Reader reader;

        Json::Value root;



        //从文件中读取,保证当前文件有test.json文件

        ifstream in("test.json", ios::binary);

        //in.open("test.json", ios::binary);



        if( !in.is_open() )  

        { 

        cout << "Error opening file\n"; 

        return; 

        }



        /*

        //test.json内容如下:

        {

                "name":"Tsybius",

                "age":23,

                "sex_is_male":true,

                "partner":

                {

                        "partner_name":"Galatea",

                        "partner_age":21,

                        "partner_sex_is_male":false

                },

                "achievement":["ach1","ach2","ach3"]

        }

        */



        if(reader.parse(in,root))

        {

        //读取根节点信息

        string name = root["name"].asString();

        int age = root["age"].asInt();

        bool sex_is_male = root["sex_is_male"].asBool();



        cout << "My name is " << name << endl;

        cout << "I'm " << age << " years old" << endl;

        cout << "I'm a " << (sex_is_male ? "man" : "woman") << endl;



        //读取子节点信息

        string partner_name = root["partner"]["partner_name"].asString();

        int partner_age = root["partner"]["partner_age"].asInt();

        bool partner_sex_is_male = root["partner"]["partner_sex_is_male"].asBool();



        cout << "My partner's name is " << partner_name << endl;

        cout << (partner_sex_is_male ? "he" : "she") << " is "

                << partner_age << " years old" << endl;



        //读取数组信息

        cout << "Here's my achievements:" << endl;

        for(unsigned int i = 0; i < root["achievement"].size(); i++)

        {

                string ach = root["achievement"][i].asString();

                cout << ach << '\t';

        }

        cout << endl;



        cout << "Reading Complete!" << endl;

        }

        else

        {

        cout << "parse error\n" << endl;        

        }



        in.close();

}

test.json文件内容如下:

{

        "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"]

}

3)将信息保存为JSON格式

#include <string>

#include <json/json.h>

#include <iostream>

#include <fstream>

using namespace std;



void writeFileJson();//将信息保存为JSON格式



int main(int argc, char *argv[]) 

{

        writeFileJson();

 

        return 0;

}



//将信息保存为JSON格式

void writeFileJson()

{

        //根节点

        Json::Value root;

 

        //根节点属性

        root["name"] = Json::Value("Mike Jiang");

        root["age"] = Json::Value(23);

        root["sex_is_male"] = Json::Value(true);

 

        //子节点

        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");

 

        //直接输出

        cout << "FastWriter:" << endl;

        Json::FastWriter fw;

        cout << fw.write(root) << endl << endl;

 

        //缩进输出

        cout << "StyledWriter:" << endl;

        Json::StyledWriter sw;

        cout << sw.write(root) << endl << endl;

 

        //输出到文件

        ofstream os;

        os.open("demo.json");

        os << sw.write(root);

        os.close();

 

        /*

        //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

        }

        */



}
 
编译运行结果如下: 

生成的demo.json文件内容如下:

//1
//从字符串中读取

#include <string>
#include "json/json.h"
#include <iostream>
#include <fstream>

using namespace std;

void readStrJson(); //从字符串中读取JSON
void readStrProJson(); //从字符串中读取JSON(内容复杂些)

int main01(int argc, char *argv[]) 
{
        readStrJson();
        
        cout << "\n\n";
        readStrProJson();
        
        system("pause");
        return 0;
}

//从字符串中读取JSON
void readStrJson() 
{
        //字符串
  const char* str = 
      "{\"praenomen\":\"Gaius\",\"nomen\":\"Julius\",\"cognomen\":\"Caezar\","
      "\"born\":-100,\"died\":-44}";
      
  /*
  //json内容如下:
  {
                "praenomen":"Gaius",
                "nomen":"Julius",
                "cognomen":"Caezar",
                "born":-100,
                "died":-44 
        }
  */

  Json::Reader reader;
  Json::Value root;

  //从字符串中读取数据
  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 << praenomen + " " + nomen + " " + cognomen
          << " was born in year " << born 
          << ", died in year " << died << endl;
  }
  
}

//从字符串中读取JSON(内容复杂些)
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 value;

        if (reader.parse(strValue, value))
        {
                string out = value["name"].asString();
                cout << out << endl;
                const Json::Value arrayObj = value["array"];
                for (unsigned int i = 0; i < arrayObj.size(); i++)
                {
                        if (!arrayObj[i].isMember("cpp")) 
                                continue;
                        out = arrayObj[i]["cpp"].asString();
                        cout << out;
                        if (i != (arrayObj.size() - 1))
                                cout << endl;
                }
        }
}






//2
//从文件中读取


void readFileJson(); //从文件中读取JSON,一个存储了JSON格式字符串的文件

int main02(int argc, char *argv[]) 
{
        readFileJson();
        
        return 0;
}

//从文件中读取JSON
void readFileJson()
{
        Json::Reader reader;
        Json::Value root;

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

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

        /*
        //test.json内容如下:
        {
                "name":"Tsybius",
                "age":23,
                "sex_is_male":true,
                "partner":
                {
                        "partner_name":"Galatea",
                        "partner_age":21,
                        "partner_sex_is_male":false
                },
                "achievement":["ach1","ach2","ach3"]
        }
        */

        if(reader.parse(in,root))
        {
        //读取根节点信息
        string name = root["name"].asString();
        int age = root["age"].asInt();
        bool sex_is_male = root["sex_is_male"].asBool();

        cout << "My name is " << name << endl;
        cout << "I'm " << age << " years old" << endl;
        cout << "I'm a " << (sex_is_male ? "man" : "woman") << endl;

        //读取子节点信息
        string partner_name = root["partner"]["partner_name"].asString();
        int partner_age = root["partner"]["partner_age"].asInt();
        bool partner_sex_is_male = root["partner"]["partner_sex_is_male"].asBool();

        cout << "My partner's name is " << partner_name << endl;
        cout << (partner_sex_is_male ? "he" : "she") << " is "
                << partner_age << " years old" << endl;

        //读取数组信息
        cout << "Here's my achievements:" << endl;
        for(unsigned int i = 0; i < root["achievement"].size(); i++)
        {
                string ach = root["achievement"][i].asString();
                cout << ach << '\t';
        }
        cout << endl;

        cout << "Reading Complete!" << endl;
        }
        else
        {
        cout << "parse error\n" << endl;        
        }

        in.close();
}



//3
//保存为json格式


void writeFileJson();//将信息保存为JSON格式

int main03(int argc, char *argv[]) 
{
        writeFileJson();
        
        return 0;
}

//将信息保存为JSON格式
void writeFileJson()
{
        //根节点
        Json::Value root;
        
        //根节点属性
        root["name"] = Json::Value("Mike Jiang");
        root["age"] = Json::Value(23);
        root["sex_is_male"] = Json::Value(true);
        
        //子节点
        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");
        
        //直接输出
        cout << "FastWriter:" << endl;
        Json::FastWriter fw;
        cout << fw.write(root) << endl << endl;
        
        //缩进输出
        cout << "StyledWriter:" << endl;
        Json::StyledWriter sw;
        cout << sw.write(root) << endl << endl;
        
        //输出到文件
        ofstream os;
        os.open("demo.json");
        os << sw.write(root);
        os.close();
        
        /*
        //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 main()
{
    ifstream in("D://test.json",ios::binary);
    if(!in.is_open()) return;
    Json::Reader reader;
    Json::Value root;
    if(reader.parse(in,root))
    {
        /*
            {
                "json":"jsontest",
                    "name":"gongluck",
                    "birthday":
                {
                    "year":"1993",
                        "mon":"11",
                        "day":"02"
                },
                "job":[
                    {"first":"coder"},
                    {"second":"doter"},
                    {
                        "third":"loser",
                            "fourth":"winner"
                    }
                ]
            }
        */
        cout <<"json : " <<root["json"].asString() << endl;
        cout << "name : " << root["name"].asString()<<endl;
        cout << "birthday : " <<
            root["birthday"]["year"].asString() << "-"<<
            root["birthday"]["mon"].asString() << "-"<<
            root["birthday"]["day"].asString() <<endl;

        cout << "job : " <<endl;
        cout << root["job"][0u]["first"].asString()<<","<<
                      root["job"][1]["second"].asString()<<","<<
                      root["job"][2]["third"].asString()<<","<<
                      root["job"][2]["fourth"].asString()<<endl;

//         const Json::Value array = root["job"];
//         for (unsigned int i = 0; i < array.size(); i++)
//         {
//             if (!array[i].isMember("first"))
//                 continue;
//             cout << array[i]["first"].asString();
//        
    }

    system("pause");
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • nginx rtmp server搭建

    mkdir nginx wget http://nginx.org/download/nginx-1.12.2.tar.gz tar -zxvf nginx-1...

    _gongluck
  • boost: atomic

    版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/...

    _gongluck
  • 文本编辑器

    文本编辑器——记事本类型的应用,可以打开、编辑、保存文本文档。可以增加单词高亮和其它的一些特性。 效果图: ? //CGEditorDlg成员 public: ...

    _gongluck
  • 超详细:自动化运维之jumpserver堡垒机入门到掌握

    1.3 建立 Python 虚拟环境 因为 CentOS 7 自带的是 Python2, 而 Yum 等工具依赖原来的 Python, 为了不扰乱原来的环境我们...

    迅达集团
  • 如何使用统计显着性检验来解释机器学习结果

    在比较两种不同的机器学习算法或比较相同的算法与不同的配置时,收集一组结果是一个好习惯。

    老人雨何
  • 通俗易懂PHP基础【7-控制语句】

    如果你每天能抽出半点钟,你每天至少可以读三四页,每月可以读一百页,到了一年也就可以读四五本书。何况你在假期中每天断不会只能读三四页呢?你能否在课外读书,不是你有...

    Lemon黄
  • 设计模式之装饰模式(结构型)

    装饰模式:装饰模式就是允许向一个现有的对象添加新的功能,同时又不改变其结构,装饰模式是一种对象结构型设计模式。

    用户1208223
  • Detectron2 实用上手教程

    随着最新的 Pythorc1.3 版本的发布,下一代完全重写了它以前的目标检测框架,新的目标检测框架被称为 Detectron2。本教程将通过使用自定义 COC...

    AI研习社
  • 16(01)总结List的子类,ArrayList,Vector,LinkedList

    1:List的子类(掌握) (1)List的子类特点 ArrayList: 底层数据结构是数组,查询快,增删慢 线程不安全,效率高 Vector: ...

    奋斗蒙
  • boost: atomic

    版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/...

    _gongluck

扫码关注云+社区

领取腾讯云代金券