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

[cpp]  view plain  copy
  1. #include <string>  
  2. #include <json/json.h>  
  3. #include <iostream>  
  4. #include <fstream>  
  5. using namespace std;  
  6.   
  7. void readStrJson(); //从字符串中读取JSON  
  8. void readStrProJson(); //从字符串中读取JSON(内容复杂些)  
  9.   
  10. int main(int argc, char *argv[])   
  11. {  
  12.     readStrJson();  
  13.       
  14.     cout << "\n\n";  
  15.     readStrProJson();  
  16.       
  17.     return 0;  
  18. }  
  19.   
  20. //从字符串中读取JSON  
  21. void readStrJson()   
  22. {  
  23.     //字符串  
  24.   const char* str =   
  25.       "{\"praenomen\":\"Gaius\",\"nomen\":\"Julius\",\"cognomen\":\"Caezar\","  
  26.       "\"born\":-100,\"died\":-44}";  
  27.         
  28.   /* 
  29.   //json内容如下: 
  30.   { 
  31.         "praenomen":"Gaius", 
  32.         "nomen":"Julius", 
  33.         "cognomen":"Caezar", 
  34.         "born":-100, 
  35.         "died":-44  
  36.     } 
  37.   */  
  38.   
  39.   Json::Reader reader;  
  40.   Json::Value root;  
  41.   
  42.   //从字符串中读取数据  
  43.   if(reader.parse(str,root))  
  44.   {  
  45.       string praenomen = root["praenomen"].asString();  
  46.       string nomen = root["nomen"].asString();  
  47.       string cognomen = root["cognomen"].asString();  
  48.       int born = root["born"].asInt();  
  49.       int died = root["died"].asInt();  
  50.   
  51.       cout << praenomen + " " + nomen + " " + cognomen  
  52.           << " was born in year " << born   
  53.           << ", died in year " << died << endl;  
  54.   }  
  55.     
  56. }  
  57.   
  58. //从字符串中读取JSON(内容复杂些)  
  59. void readStrProJson()   
  60. {  
  61.     string strValue = "{\"name\":\"json\",\"array\":[{\"cpp\":\"jsoncpp\"},{\"java\":\"jsoninjava\"},{\"php\":\"support\"}]}";  
  62.     /* 
  63.     //json内容如下: 
  64.     { 
  65.     "name": "json″, 
  66.     "array": [ 
  67.         { 
  68.             "cpp": "jsoncpp" 
  69.         }, 
  70.         { 
  71.             "java": "jsoninjava" 
  72.         }, 
  73.         { 
  74.             "php": "support" 
  75.         } 
  76.     ] 
  77.     } 
  78.     */  
  79.   
  80.   
  81.     Json::Reader reader;  
  82.     Json::Value value;  
  83.   
  84.     if (reader.parse(strValue, value))  
  85.     {  
  86.         string out = value["name"].asString();  
  87.         cout << out << endl;  
  88.         const Json::Value arrayObj = value["array"];  
  89.         for (unsigned int i = 0; i < arrayObj.size(); i++)  
  90.         {  
  91.             if (!arrayObj[i].isMember("cpp"))   
  92.                 continue;  
  93.             out = arrayObj[i]["cpp"].asString();  
  94.             cout << out;  
  95.             if (i != (arrayObj.size() - 1))  
  96.                 cout << endl;  
  97.         }  
  98.     }  
  99. }  

编译运行结果如下:



2)从文件中读取JSON

[cpp]  view plain  copy
  1. #include <string>  
  2. #include <json/json.h>  
  3. #include <iostream>  
  4. #include <fstream>  
  5. using namespace std;  
  6.   
  7. void readFileJson(); //从文件中读取JSON,一个存储了JSON格式字符串的文件  
  8.   
  9. int main(int argc, char *argv[])   
  10. {  
  11.     readFileJson();  
  12.       
  13.     return 0;  
  14. }  
  15.   
  16. //从文件中读取JSON  
  17. void readFileJson()  
  18. {  
  19.     Json::Reader reader;  
  20.     Json::Value root;  
  21.   
  22.     //从文件中读取,保证当前文件有test.json文件  
  23.     ifstream in("test.json", ios::binary);  
  24.     //in.open("test.json", ios::binary);  
  25.   
  26.     if( !in.is_open() )    
  27.     {   
  28.     cout << "Error opening file\n";   
  29.     return;   
  30.     }  
  31.   
  32.     /* 
  33.     //test.json内容如下: 
  34.     { 
  35.         "name":"Tsybius", 
  36.         "age":23, 
  37.         "sex_is_male":true, 
  38.         "partner": 
  39.         { 
  40.             "partner_name":"Galatea", 
  41.             "partner_age":21, 
  42.             "partner_sex_is_male":false 
  43.         }, 
  44.         "achievement":["ach1","ach2","ach3"] 
  45.     } 
  46.     */  
  47.   
  48.     if(reader.parse(in,root))  
  49.     {  
  50.     //读取根节点信息  
  51.     string name = root["name"].asString();  
  52.     int age = root["age"].asInt();  
  53.     bool sex_is_male = root["sex_is_male"].asBool();  
  54.   
  55.     cout << "My name is " << name << endl;  
  56.     cout << "I'm " << age << " years old" << endl;  
  57.     cout << "I'm a " << (sex_is_male ? "man" : "woman") << endl;  
  58.   
  59.     //读取子节点信息  
  60.     string partner_name = root["partner"]["partner_name"].asString();  
  61.     int partner_age = root["partner"]["partner_age"].asInt();  
  62.     bool partner_sex_is_male = root["partner"]["partner_sex_is_male"].asBool();  
  63.   
  64.     cout << "My partner's name is " << partner_name << endl;  
  65.     cout << (partner_sex_is_male ? "he" : "she") << " is "  
  66.         << partner_age << " years old" << endl;  
  67.   
  68.     //读取数组信息  
  69.     cout << "Here's my achievements:" << endl;  
  70.     for(unsigned int i = 0; i < root["achievement"].size(); i++)  
  71.     {  
  72.         string ach = root["achievement"][i].asString();  
  73.         cout << ach << '\t';  
  74.     }  
  75.     cout << endl;  
  76.   
  77.     cout << "Reading Complete!" << endl;  
  78.     }  
  79.     else  
  80.     {  
  81.     cout << "parse error\n" << endl;      
  82.     }  
  83.   
  84.     in.close();  
  85. }  

test.json文件内容如下:

[html]  view plain  copy
  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格式

[cpp]  view plain  copy
  1. #include <string>  
  2. #include <json/json.h>  
  3. #include <iostream>  
  4. #include <fstream>  
  5. using namespace std;  
  6.   
  7. void writeFileJson();//将信息保存为JSON格式  
  8.   
  9. int main(int argc, char *argv[])   
  10. {  
  11.     writeFileJson();  
  12.       
  13.     return 0;  
  14. }  
  15.   
  16. //将信息保存为JSON格式  
  17. void writeFileJson()  
  18. {  
  19.     //根节点  
  20.     Json::Value root;  
  21.       
  22.     //根节点属性  
  23.     root["name"] = Json::Value("Mike Jiang");  
  24.     root["age"] = Json::Value(23);  
  25.     root["sex_is_male"] = Json::Value(true);  
  26.       
  27.     //子节点  
  28.     Json::Value partner;  
  29.       
  30.     //子节点属性  
  31.     partner["partner_name"] = Json::Value("Galatea");  
  32.     partner["partner_age"] = Json::Value(21);  
  33.     partner["partner_sex_is_male"] = Json::Value(false);  
  34.       
  35.     //子节点挂到根节点上  
  36.     root["partner"] = Json::Value(partner);  
  37.       
  38.     //数组形式  
  39.     root["achievement"].append("ach1");  
  40.     root["achievement"].append("ach2");  
  41.     root["achievement"].append("ach3");  
  42.       
  43.     //直接输出  
  44.     cout << "FastWriter:" << endl;  
  45.     Json::FastWriter fw;  
  46.     cout << fw.write(root) << endl << endl;  
  47.       
  48.     //缩进输出  
  49.     cout << "StyledWriter:" << endl;  
  50.     Json::StyledWriter sw;  
  51.     cout << sw.write(root) << endl << endl;  
  52.       
  53.     //输出到文件  
  54.     ofstream os;  
  55.     os.open("demo.json");  
  56.     os << sw.write(root);  
  57.     os.close();  
  58.       
  59.     /* 
  60.     //json文件内容如下: 
  61.     { 
  62.         "achievement" : [ "ach1", "ach2", "ach3" ], 
  63.         "age" : 23, 
  64.         "name" : "Mike Jiang", 
  65.         "partner" : { 
  66.             "partner_age" : 21, 
  67.             "partner_name" : "Galatea", 
  68.             "partner_sex_is_male" : false 
  69.         }, 
  70.         "sex_is_male" : true 
  71.     } 
  72.     */  
  73.   
  74. }  

编译运行结果如下:


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



本教程示例代码下载请点此链接:http://download.csdn.net/detail/tennysonsky


参考资料:

http://www.cnblogs.com/ggjucheng

http://my.oschina.net/Tsybius2014

猜你喜欢

转载自blog.csdn.net/fakine/article/details/79272090