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

来源:互联网 发布:微信商城分销系统源码 编辑:程序博客网 时间:2024/06/06 01:30

转自:http://blog.csdn.net/tennysonsky/article/details/48809835

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
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 民族习俗 什么是民族 什么的民族 民族 英语 民族风俗 民族英语 民族问题 民族英文 民族学校 少数民族的 龙虾民族 少数民族有 各少数民族 几个民族 民族管弦乐 民族自豪感 少数民族族 民族酒文化 我们的民族是伟大的民族 民族是什么 民族 英文 竹筒饭民族 民族大联欢 我国民族 民族的 多少民族 大民族 白衣民族 五十六个民族五十六朵花 西南民族大学 内蒙古民族大学 贵州民族大学 五十六个民族 中国少数民族 湖北民族大学 西藏民族大学 四川民族学院 广西民族师范学院 青海民族大学 少数民族简笔画 西南民族大学学工网