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

  1. #include <string>
  2. #include <json/json.h>
  3. #include <iostream>
  4. #include <fstream>
  5. using namespace std;

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

  8. int main(int argc, char *argv[])
  9. {
  10.         readStrJson();
  11.        
  12.         cout << "\n\n";
  13.         readStrProJson();
  14.        
  15.         return 0;
  16. }

  17. //从字符串中读取JSON
  18. void readStrJson()
  19. {
  20.         //字符串
  21.   const char* str =
  22.       "{\"praenomen\":\"Gaius\",\"nomen\":\"Julius\",\"cognomen\":\"Caezar\","
  23.       "\"born\":-100,\"died\":-44}";
  24.       
  25.   /*
  26.   //json内容如下:
  27.   {
  28.                 "praenomen":"Gaius",
  29.                 "nomen":"Julius",
  30.                 "cognomen":"Caezar",
  31.                 "born":-100,
  32.                 "died":-44
  33.         }
  34.   */

  35.   Json::Reader reader;
  36.   Json::Value root;

  37.   //从字符串中读取数据
  38.   if(reader.parse(str,root))
  39.   {
  40.       string praenomen = root["praenomen"].asString();
  41.       string nomen = root["nomen"].asString();
  42.       string cognomen = root["cognomen"].asString();
  43.       int born = root["born"].asInt();
  44.       int died = root["died"].asInt();

  45.       cout << praenomen + " " + nomen + " " + cognomen
  46.           << " was born in year " << born
  47.           << ", died in year " << died << endl;
  48.   }
  49.   
  50. }

  51. //从字符串中读取JSON(内容复杂些)
  52. void readStrProJson()
  53. {
  54.         string strValue = "{\"name\":\"json\",\"array\":[{\"cpp\":\"jsoncpp\"},{\"java\":\"jsoninjava\"},{\"php\":\"support\"}]}";
  55.         /*
  56.         //json内容如下:
  57.         {
  58.     "name": "json″,
  59.     "array": [
  60.         {
  61.             "cpp": "jsoncpp"
  62.         },
  63.         {
  64.             "java": "jsoninjava"
  65.         },
  66.         {
  67.             "php": "support"
  68.         }
  69.     ]
  70.         }
  71.         */


  72.         Json::Reader reader;
  73.         Json::Value value;

  74.         if (reader.parse(strValue, value))
  75.         {
  76.                 string out = value["name"].asString();
  77.                 cout << out << endl;
  78.                 const Json::Value arrayObj = value["array"];
  79.                 for (unsigned int i = 0; i < arrayObj.size(); i++)
  80.                 {
  81.                         if (!arrayObj[i].isMember("cpp"))
  82.                                 continue;
  83.                         out = arrayObj[i]["cpp"].asString();
  84.                         cout << out;
  85.                         if (i != (arrayObj.size() - 1))
  86.                                 cout << endl;
  87.                 }
  88.         }
  89. }
复制代码

编译运行结果如下:



2)从文件中读取JSON

  1. #include <string>
  2. #include <json/json.h>
  3. #include <iostream>
  4. #include <fstream>
  5. using namespace std;

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

  7. int main(int argc, char *argv[])
  8. {
  9.         readFileJson();
  10.        
  11.         return 0;
  12. }

  13. //从文件中读取JSON
  14. void readFileJson()
  15. {
  16.         Json::Reader reader;
  17.         Json::Value root;

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

  21.         if( !in.is_open() )  
  22.         {
  23.         cout << "Error opening file\n";
  24.         return;
  25.         }

  26.         /*
  27.         //test.json内容如下:
  28.         {
  29.                 "name":"Tsybius",
  30.                 "age":23,
  31.                 "sex_is_male":true,
  32.                 "partner":
  33.                 {
  34.                         "partner_name":"Galatea",
  35.                         "partner_age":21,
  36.                         "partner_sex_is_male":false
  37.                 },
  38.                 "achievement":["ach1","ach2","ach3"]
  39.         }
  40.         */

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

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

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

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

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

  65.         cout << "Reading Complete!" << endl;
  66.         }
  67.         else
  68.         {
  69.         cout << "parse error\n" << endl;       
  70.         }

  71.         in.close();
  72. }
复制代码

test.json文件内容如下:

  1. {
  2.         "name":"Mike Jiang",
  3.         "age":23,
  4.         "sex_is_male":true,
  5.         "partner":
  6.         {
  7.             "partner_name":"Galatea",
  8.             "partner_age":21,
  9.             "partner_sex_is_male":false
  10.         },
  11.         "achievement":["ach1","ach2","ach3"]
  12. }
复制代码

编译运行结果如下:



3)将信息保存为JSON格式

  1. #include <string>
  2. #include <json/json.h>
  3. #include <iostream>
  4. #include <fstream>
  5. using namespace std;

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

  7. int main(int argc, char *argv[])
  8. {
  9.         writeFileJson();
  10.        
  11.         return 0;
  12. }

  13. //将信息保存为JSON格式
  14. void writeFileJson()
  15. {
  16.         //根节点
  17.         Json::Value root;
  18.        
  19.         //根节点属性
  20.         root["name"] = Json::Value("Mike Jiang");
  21.         root["age"] = Json::Value(23);
  22.         root["sex_is_male"] = Json::Value(true);
  23.        
  24.         //子节点
  25.         Json::Value partner;
  26.        
  27.         //子节点属性
  28.         partner["partner_name"] = Json::Value("Galatea");
  29.         partner["partner_age"] = Json::Value(21);
  30.         partner["partner_sex_is_male"] = Json::Value(false);
  31.        
  32.         //子节点挂到根节点上
  33.         root["partner"] = Json::Value(partner);
  34.        
  35.         //数组形式
  36.         root["achievement"].append("ach1");
  37.         root["achievement"].append("ach2");
  38.         root["achievement"].append("ach3");
  39.        
  40.         //直接输出
  41.         cout << "FastWriter:" << endl;
  42.         Json::FastWriter fw;
  43.         cout << fw.write(root) << endl << endl;
  44.        
  45.         //缩进输出
  46.         cout << "StyledWriter:" << endl;
  47.         Json::StyledWriter sw;
  48.         cout << sw.write(root) << endl << endl;
  49.        
  50.         //输出到文件
  51.         ofstream os;
  52.         os.open("demo.json");
  53.         os << sw.write(root);
  54.         os.close();
  55.        
  56.         /*
  57.         //json文件内容如下:
  58.         {
  59.                 "achievement" : [ "ach1", "ach2", "ach3" ],
  60.                 "age" : 23,
  61.                 "name" : "Mike Jiang",
  62.                 "partner" : {
  63.                         "partner_age" : 21,
  64.                         "partner_name" : "Galatea",
  65.                         "partner_sex_is_male" : false
  66.                 },
  67.                 "sex_is_male" : true
  68.         }
  69.         */

  70. }
复制代码

编译运行结果如下:


生成的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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值