使用VS2008编译jsoncpp源码为静态库,在自己工程中使用

1. VS2008

2. MFC工程下使用

3. JSON源码,下载地址:

4. 解压下载的问价:jsoncpp-src-0.5.0.tar.gz  jsoncpp源码

5.打开源码的工程E:\vs2008_project\json\jsoncpp-src-0.5.0\makefiles\vs71\jsoncpp.sln

6.生成Debug和Release版本的lib文件,步骤如下:

  1>>打开页面如下图1.

  2>>(Debug和Release模式方式一样)右键lib_json项目->仅用于项目->仅生产lib_json

  3>>再次右键lib_json项目->仅用于项目->仅链接lib_json

  4>>生成lib文件在E:\vs2008_project\json\jsoncpp-src-0.5.0\build\vs71下

  5>>注意:fatal error C1083: 无法打开编译器生成的文件:“../../build/vs71/release/lib_json\json_writer.asm”: No such file or directory ,一般就是release版本的lib需要在属性设置的时候:配置属性->常规->项目默认值最下面两项改成如图所示.VS 2008 编译jsoncpp_jsoncpp

 

7. 拷贝 E:\vs2008_project\json\jsoncpp-src-0.5.0\include文件的下的json文件到自己的工程下.

8. 拷贝刚生成的两个lib(如默认名称Debug版本json_vc71_libmtd.lib  Release版本json_vc71_libmt.lib)到工程下.目录任意

9.lib文件 + 头文件.h 就可以添加到自己的工程下编译了

 1&& 项目->属性->配置属性->C/C++->常规->附加包含目录(jsoncpp源码的头文件.h文件所在位置)

 2&& 项目->属性->配置属性->链接器->常规->附加库目录(jsoncpp源码刚生成json_vc71_libmtd.lib和json_vc71_libmt.lib的目录)

 3&& 项目->属性->配置属性->链接器->输入->附加依赖项(Debug版本json_vc71_libmtd.lib/Release版本json_vc71_libmt.lib)

10.一般情况下会报错,我的工程师MFC工程,而jsoncpp是win32控制台工程,所以那面容易出错

1## 错误如出现error LNK2005已定义.可修改  项目->属性->配置属性->常规->MFC的使用->在静态库中使用MFC

2## StdAfx.h没有引用可以在   项目->属性->配置属性->C/C++->预编译头->不使用预编译(/Yu)

3## 项目->属性->配置属性->C/C++->代码生成-->运行时库Debug:多线程调试(/MTD) 或者 Release:多线程调试(/MT)

11 .从文件中解析json.

CameraConfig是一个结构体,结构体类型和json转换类型一定要一致,否则崩溃.

 

[cpp]  view plain  copy
 
  1. #define JN_bAlarm           "bAlarm"  
  2. #define JN_bAutoStart           "bAutoStart"  
  3. #define JN_mAlarmCru            "mAlarmCru"  
  4. #define JN_mDevIndex            "mDevIndex"  
  5. #define JN_mDevIp           "mDevIp"  
  6. #define JN_mDevPWD              "mDevPWD"  

 

[cpp]  view plain  copy
 
  1. struct CameraConfig  
  2. {  
  3.     bool bAlarm;  
  4.     bool bAutoStart;  
  5.     int mAlarmCru;  
  6.     string mDevIndex;  
  7.     string mDevIp;  
  8.     string mDevPWD;  
  9. };  

读取文件解析json.   filename是文件名字

 

[cpp]  view plain  copy
 
  1. vector<CameraConfig> parseJsonFromFile(const char*  filename)  
  2. {  
  3.     vector<CameraConfig> re;  
  4.     FILE *file = fopen( filename, "rb" );  
  5.     if ( !file )  
  6.     {  
  7.         return re;  
  8.     }  
  9.     fseek( file, 0, SEEK_END );  
  10.     long size = ftell( file );  
  11.     fseek( file, 0, SEEK_SET );  
  12.     std::string text;  
  13.     char *buffer = new char[size+1];  
  14.     buffer[size] = 0;  
  15.     if ( !fread( buffer, 1, size, file ) == (unsigned long)size )  
  16.     {  
  17.         return re;  
  18.     }  
  19.     text = buffer;  
  20.     fclose( file );  
  21.     delete[] buffer;  
  22.     re = parseJsonFromString(text);  
  23.     return  re;  
  24. }  
[cpp]  view plain  copy
 
  1. vector<CameraConfig> parseJsonFromString(const std::string str) ///传入字符串解析  
  2. {  
  3.     Json::Reader reader;    
  4.     Json::Value root;    
  5.     vector<CameraConfig> vecCamera;  
  6.     if (!reader.parse(str, root))  // reader将Json字符串解析到root,root将包含Json里所有子元素     
  7.     {    
  8.         return vecCamera;  
  9.     }   
  10.     int size = 0;  
  11.     if (root.isArray())//根是否为数组  
  12.     {  
  13.         size = root.size();  
  14.         // 遍历数组    
  15.         for(int i = 0; i < size; ++i)    
  16.         {    
  17.             CameraConfig camera;  
  18.             camera.bAlarm     = root[i][JN_bAlarm].asBool();    
  19.             camera.bAutoStart = root[i][JN_bAutoStart].asBool();    
  20.             camera.mAlarmCru  = root[i][JN_mAlarmCru].asInt();    
  21.             camera.mDevIndex  = root[i][JN_mDevIndex].asString();    
  22.             camera.mDevIp     = root[i][JN_mDevIp].asString();    
  23.             camera.mDevPWD    = root[i][JN_mDevPWD].asString();    
  24.             vecCamera.push_back(camera);  
  25.         }    
  26.     }  
  27.     else//根目录不是数组时  
  28.     {  
  29.         CameraCongig camera;  
  30.         camera.bAlarm     = root[JN_bAlarm].asBool();    
  31.         camera.bAutoStart = root[JN_bAutoStart].asBool();    
  32.         camera.mAlarmCru  = root[JN_mAlarmCru].asInt();    
  33.         camera.mDevIndex  = root[JN_mDevIndex].asString();    
  34.         camera.mDevIp     = root[JN_mDevIp].asString();    
  35.         camera.mDevPWD    = root[JN_mDevPWD].asString();   
  36.         vecCamera.push_back(camera);      
  37.     }  
  38.     return vecCamera;  
  39. }  
把内容保存在文件中,根目录为数组  : vecCamera保存数据,path保存文件路径  

 

 

[cpp]  view plain  copy
 
  1. void  writeJsonFile(vector<CameraConfig> &vecCamera, const string &path)  
  2. {  
  3.     Json::StyledWriter sw; //按照标准格式写入  
  4.     Json::Value root;  //根为数组  
  5.     for (int i = 0; i < vecCamera.size(); i++)//循环加入数组内容到json节点中  
  6.     {  
  7.         root[i][JN_bAlarm]  = Json::Value(vecCamera.at(i).bAlarm);    
  8.         root[i][JN_bAutoStart]  = Json::Value(vecCamera.at(i).bAutoStart);     
  9.         root[i][JN_mAlarmCru]   = Json::Value(vecCamera.at(i).mAlarmCru);     
  10.         root[i][JN_mDevIndex]   = Json::Value(vecCamera.at(i).mDevIndex);    
  11.         root[i][JN_mDevIp]      = Json::Value(vecCamera.at(i).mDevIp);     
  12.         root[i][JN_mDevPWD]     = Json::Value(vecCamera.at(i).mDevPWD);   
  13.     }   
  14.     ofstream os;    
  15.     os.open(path.c_str());    
  16.     os << sw.write(root); //写入文件  
  17.     os.close();    
  18. }  
[html]  view plain  copy
 
  1. [       camera.cfg文件如下   根目录为数组,数组名字为空  
  2.    {  
  3.       "bAlarm" : false,  
  4.       "bAutoStart" : false,  
  5.       "mAlarmCru" : 0,  
  6.       "mDevIndex" : "小明",  
  7.       "mDevIp" : "172.16.3.245",  
  8.       "mDevPWD" : "12345",  
  9.    },  
  10.    {  
  11.       "bAlarm" : false,  
  12.       "bAutoStart" : false,  
  13.       "mAlarmCru" : 0,  
  14.       "mDevIndex" : "小王",  
  15.       "mDevIp" : "172.16.3.248",  
  16.       "mDevPWD" : "12345",   }  
  17. ]  
[cpp]  view plain  copy
 
  1. <span style="font-size:24px;">//将信息保存为JSON格式 ,内嵌套格式</span>  
[cpp]  view plain  copy
 
  1. <pre name="code" class="cpp">   
  2. void writeFileJson()    
  3. {    
  4.     //根节点    
  5.     Json::Value root;    
  6.         
  7.     //根节点属性    
  8.     root["name"] = Json::Value("Mike Jiang");    
  9.     root["age"] = Json::Value(23);    
  10.     root["sex_is_male"] = Json::Value(true);    
  11.         
  12.     //子节点    
  13.     Json::Value partner;    
  14.         
  15.     //子节点属性    
  16.     partner["partner_name"] = Json::Value("Galatea");    
  17.     partner["partner_age"] = Json::Value(21);    
  18.     partner["partner_sex_is_male"] = Json::Value(false);    
  19.         
  20.     //子节点挂到根节点上    
  21.     root["partner"] = Json::Value(partner);    
  22.         
  23.     //数组形式    
  24.     root["achievement"].append("ach1");    
  25.     root["achievement"].append("ach2");    
  26.     root["achievement"].append("ach3");    
  27.         
  28.     //直接输出    
  29.     cout << "FastWriter:" << endl;    
  30.     Json::FastWriter fw;    
  31.     cout << fw.write(root) << endl << endl;    
  32.         
  33.     //缩进输出    
  34.     cout << "StyledWriter:" << endl;    
  35.     Json::StyledWriter sw;    
  36.     cout << sw.write(root) << endl << endl;    
  37.         
  38.     //输出到文件    
  39.     ofstream os;    
  40.     os.open("demo.json");    
  41.     os << sw.write(root);    
  42.     os.close();    
  43. }  



[cpp]  view plain  copy
 
  1. 1. 从字符串解析json  
  2.     const char* str = "{\"uploadid\": \"UP000000\",\"code\": 100,\"msg\": \"\",\"files\": \"\"}";    
  3.     Json::Reader reader;    
  4.     Json::Value root;    
  5.     if (reader.parse(str, root))  // reader将Json字符串解析到root,root将包含Json里所有子元素    
  6.     {    
  7.         std::string upload_id = root["uploadid"].asString();  // 访问节点,upload_id = "UP000000"    
  8.         int code = root["code"].asInt();    // 访问节点,code = 100   
  9.     }    
  10. 2. 从文件解析json //读取文件test.json  
  11. int ReadJsonFromFile(const char* filename)    
  12. {    
  13.     Json::Reader reader;// 解析json用Json::Reader     
  14.     Json::Value root; // Json::Value是一种很重要的类型,可以代表任意类型。如int, string, object, array           
  15.   
  16.     std::ifstream is;    
  17.     is.open (filename, std::ios::binary );      
  18.     if (reader.parse(is, root, FALSE))    
  19.     {    
  20.         std::string code;    
  21.         if (!root["files"].isNull())  // 访问节点,Access an object value by name, create a null member if it does not exist.    
  22.         {    code = root["uploadid"].asString();  }  
  23.         code = root.get("uploadid", "null").asString();// 访问节点,Return the member named key if it exist, defaultValue otherwise.      
  24.   
  25.         int file_size = root["files"].size();  // 得到"files"的数组个数  嵌套类型  
  26.         for(int i = 0; i < file_size; ++i)  // 遍历数组    
  27.         {    
  28.             Json::Value val_image = root["files"][i]["images"];    
  29.             int image_size = val_image.size();    
  30.             for(int j = 0; j < image_size; ++j)  //嵌套二层  
  31.             {    
  32.                 std::string type = val_image[j]["type"].asString();    
  33.                 std::string url  = val_image[j]["url"].asString();   
  34.                 printf("type : %s, url : %s \n", type.c_str(), url.c_str());  
  35.             }    
  36.         }    
  37.     }    
  38.     is.close();    
  39.     return 0;    
  40. }   
[cpp]  view plain  copy
 
  1. 3. 向文件中插入json  
  2. void WriteJsonData(const char* filename)  
  3. {  
  4.     Json::Reader reader;    
  5.     Json::Value root; // Json::Value是一种很重要的类型,可以代表任意类型。如int, string, object, array          
  6.   
  7.     std::ifstream is;    
  8.     is.open (filename, std::ios::binary );      
  9.     if (reader.parse(is, root))    
  10.     {    
  11.         Json::Value arrayObj;   // 构建对象    
  12.         Json::Value new_item, new_item1;    
  13.         new_item["date"] = "2011-11-11";    
  14.         new_item1["time"] = "11:11:11";    
  15.         arrayObj.append(new_item);  // 插入数组成员    
  16.         arrayObj.append(new_item1); // 插入数组成员    
  17.         int file_size = root["files"].size();    
  18.         for(int i = 0; i < file_size; ++i)    
  19.             root["files"][i]["exifs"] = arrayObj;   // 插入原json中   
  20.         std::string out = root.toStyledString();    
  21.         // 输出无格式json字符串    
  22.         Json::FastWriter writer;    
  23.         std::string strWrite = writer.write(root);  
  24.         std::ofstream ofs;  
  25.         ofs.open("test_write.json");  
  26.         ofs << strWrite;  
  27.         ofs.close();  
  28.     }   
[cpp]  view plain  copy
 
  1. }   
test.json文件如下

 

 

[cpp]  view plain  copy
 
  1. {    
  2.     "uploadid": "UP000000",    
  3.     "code": "0",    
  4.     "msg": "",    
  5.     "files":    
  6.     [    
  7.         {    
  8.             "code": "0",    
  9.             "msg": "",    
  10.             "filename": "1D_16-35_1.jpg",    
  11.             "filesize": "196690",    
  12.             "width": "1024",    
  13.             "height": "682",    
  14.             "images":    
  15.             [    
  16.                 {    
  17.                     "url": "fmn061/20111118",    
  18.                     "type": "large",    
  19.                     "width": "720",    
  20.                     "height": "479"    
  21.                 },    
  22.                 {    
  23.                     "url": "fmn061/20111118",    
  24.                     "type": "main",    
  25.                     "width": "200",    
  26.                     "height": "133"    
  27.                 }    
  28.             ]    
  29.         }    
  30.     ]    
  31. }    
插入后的文件test_W.json

 

 

[cpp]  view plain  copy
 
  1. {  
  2.    "code" : "0",  
  3.    "files" : [  
  4.       {  
  5.          "code" : "0",  
  6.          "exifs" : [  
  7.             {  
  8.                "date" : "2011-11-11"  
  9.             },  
  10.             {  
  11.                "time" : "11:11:11"  
  12.             }  
  13.          ],  
  14.          "filename" : "1D_16-35_1.jpg",  
  15.          "filesize" : "196690",  
  16.          "height" : "682",  
  17.          "images" : [  
  18.             {  
  19.                "height" : "479",  
  20.                "type" : "large",  
  21.                "url" : "fmn061/20111118",  
  22.                "width" : "720"  
  23.             },  
  24.             {  
  25.                "height" : "133",  
  26.                "type" : "main",  
  27.                "url" : "fmn061/20111118",  
  28.                "width" : "200"  
  29.             }  
  30.          ],  
  31.          "msg" : "",  
  32.          "width" : "1024"  
  33.       }  
  34.    ],  
  35.    "msg" : "",  
  36.    "uploadid" : "UP000000"  

 

  1. }