jsoncpp在linux和windows下的编译及使用详解
生活随笔
收集整理的這篇文章主要介紹了
jsoncpp在linux和windows下的编译及使用详解
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一:摘要
1. JSON是一種輕量級的數(shù)據(jù)傳輸格式,全稱為:JavaScript Object Notation,官方網(wǎng)址: http://www.json.org/json-zh.html
3. JSONCPP是一個C++用來處理JSON格式數(shù)據(jù)的第三方庫
二:說明
1. 本篇博客下載的是jsoncpp 0.5.0 版本,jsoncpp 0.5.0下載地址: http://download.csdn.net/detail/yzf279533105/9697182
1. 從上面的地址下載得到j(luò)soncpp-src-0.5.0.tar.gz文件,解壓得到j(luò)soncpp-src-0.5.0文件夾
2. 進(jìn)入目錄 jsoncpp-src-0.5.0/makefiles/vs71,打開解決方案jsoncpp.sln(注意vs71也就是VS2003,如果你的VS版本較高,默認(rèn)轉(zhuǎn)換即可,不會出什么問題)
3. 該解決方案中有三個工程,分別為jsontest,lib_json,test_lib_json
4. 不需任何操作,直接編譯工程lib_json,默認(rèn)是Debug版,該工程為靜態(tài)庫文件工程,最終產(chǎn)生lib文件,產(chǎn)生的庫文件為json_vc71_libmtd.lib,全路徑為:jsoncpp-src-
0.5.0/build/vs71/debug/lib_json/json_vc71_libmtd.lib,注意產(chǎn)生庫文件名字中的 "mtd"字樣,這個是編譯參數(shù),說明編譯的是多線程調(diào)試版,mtd的意思即Multi Debug,。當(dāng)然你也可以編譯release版
四. Windows下的使用
1. 切記:示例工程所用的Visual Studio和步驟三的編譯庫所用的Visual Studio 是同一版本。如果兩次所用VS的版本不同,鏈接靜態(tài)庫時很可能會出現(xiàn)鏈接錯誤,筆者已踩過此坑)
2. 建立一個空的win32控制臺工程,類似HellowWorld的工程即可,我這里工程命名為jsoncppExample
3. 在本示例工程根目錄添加include文件夾,把jsoncpp-src-0.5.0/include/json文件夾整個拷貝到include下面,在屬性頁 配置屬性 -> C/C++ -> 常規(guī) -> 附加包含目錄 中設(shè)置該工程的頭文件目錄,即“../include”
4. 在本示例工程根目錄添加lib文件夾,把剛才編譯的json靜態(tài)庫拷貝到lib下面,即上面的庫文件json_vc71_libmtd.lib,在屬性頁 配置屬性 -> 鏈接器 -> 常規(guī) -> 附加庫目錄 中設(shè)置該工程
的靜態(tài)庫目錄,即“../lib”;在屬性頁 配置屬性 -> 鏈接器 -> 輸入 -> 附加依賴項(xiàng) 中設(shè)置該工程的靜態(tài)庫的名字,即“json_vc71_libmtd.lib”
5. 在屬性頁 配置屬性 -> C/C++ -> 代碼生成 -> 運(yùn)行時庫 中設(shè)置為“多線程調(diào)試(/MTd)”,即和上面編譯庫時的選項(xiàng)一致
五. Linux下的編譯
1. ? 在linux下編譯jsoncpp需要使用scons,一個類似make的編譯工具。安裝scons需要pyhon,centos系統(tǒng)自帶python,如果沒有請自行安裝,這個簡單,注意pyhon版本需為2.7或者以下
2. ? 安裝scons,下載地址 http://download.csdn.net/detail/yzf279533105/9915884。筆者這里是下載到/home/scons/ 目錄下。進(jìn)入目錄 /home/scons/,執(zhí)行解壓縮命令 tar -zxvf scons-2.5.1.tar.gz。設(shè)置兩個環(huán)境變量 export MYSCONS=/home/scons/scons-2.5.1 ,export SCONS_LIB_DIR=$MYSCONS/engine 。這兩個環(huán)境變量至關(guān)重要
3. ? 編譯jsoncpp,筆者這里是下載到/home/jsoncpp/ 目錄下。進(jìn)入目錄 /home/jsoncpp/,執(zhí)行解壓縮命令 tar -zxvf jsoncpp-src-0.5.0.tar.gz,再進(jìn)入目錄 /home/jsoncpp/jsoncpp-src-0.5.0/,執(zhí)行編譯命令?python $MYSCONS/script/scons platform=linux-gcc,即可編譯jsoncpp,隨后會生成靜態(tài)庫和動態(tài)庫文件,在目錄jsoncpp-src-0.5.0/libs/linux-gcc-4.4.7中。分別是靜態(tài)庫libjson_linux-gcc-4.4.7_libmt.a,動態(tài)庫libjson_linux-gcc-4.4.7_libmt.so
六. Linux下的使用
1. JSON是一種輕量級的數(shù)據(jù)傳輸格式,全稱為:JavaScript Object Notation,官方網(wǎng)址: http://www.json.org/json-zh.html
3. JSONCPP是一個C++用來處理JSON格式數(shù)據(jù)的第三方庫
二:說明
1. 本篇博客下載的是jsoncpp 0.5.0 版本,jsoncpp 0.5.0下載地址: http://download.csdn.net/detail/yzf279533105/9697182
2. 博客內(nèi)容及所有代碼均是在該版本下編譯,運(yùn)行,測試通過的,示例代碼下載地址
windows下示例代碼:http://download.csdn.net/detail/yzf279533105/9903065
linux下示例代碼:http://download.csdn.net/detail/yzf279533105/9915877
1. 從上面的地址下載得到j(luò)soncpp-src-0.5.0.tar.gz文件,解壓得到j(luò)soncpp-src-0.5.0文件夾
2. 進(jìn)入目錄 jsoncpp-src-0.5.0/makefiles/vs71,打開解決方案jsoncpp.sln(注意vs71也就是VS2003,如果你的VS版本較高,默認(rèn)轉(zhuǎn)換即可,不會出什么問題)
3. 該解決方案中有三個工程,分別為jsontest,lib_json,test_lib_json
4. 不需任何操作,直接編譯工程lib_json,默認(rèn)是Debug版,該工程為靜態(tài)庫文件工程,最終產(chǎn)生lib文件,產(chǎn)生的庫文件為json_vc71_libmtd.lib,全路徑為:jsoncpp-src-
0.5.0/build/vs71/debug/lib_json/json_vc71_libmtd.lib,注意產(chǎn)生庫文件名字中的 "mtd"字樣,這個是編譯參數(shù),說明編譯的是多線程調(diào)試版,mtd的意思即Multi Debug,。當(dāng)然你也可以編譯release版
四. Windows下的使用
1. 切記:示例工程所用的Visual Studio和步驟三的編譯庫所用的Visual Studio 是同一版本。如果兩次所用VS的版本不同,鏈接靜態(tài)庫時很可能會出現(xiàn)鏈接錯誤,筆者已踩過此坑)
2. 建立一個空的win32控制臺工程,類似HellowWorld的工程即可,我這里工程命名為jsoncppExample
3. 在本示例工程根目錄添加include文件夾,把jsoncpp-src-0.5.0/include/json文件夾整個拷貝到include下面,在屬性頁 配置屬性 -> C/C++ -> 常規(guī) -> 附加包含目錄 中設(shè)置該工程的頭文件目錄,即“../include”
4. 在本示例工程根目錄添加lib文件夾,把剛才編譯的json靜態(tài)庫拷貝到lib下面,即上面的庫文件json_vc71_libmtd.lib,在屬性頁 配置屬性 -> 鏈接器 -> 常規(guī) -> 附加庫目錄 中設(shè)置該工程
的靜態(tài)庫目錄,即“../lib”;在屬性頁 配置屬性 -> 鏈接器 -> 輸入 -> 附加依賴項(xiàng) 中設(shè)置該工程的靜態(tài)庫的名字,即“json_vc71_libmtd.lib”
5. 在屬性頁 配置屬性 -> C/C++ -> 代碼生成 -> 運(yùn)行時庫 中設(shè)置為“多線程調(diào)試(/MTd)”,即和上面編譯庫時的選項(xiàng)一致
6. 添加一個源文件main.cpp,代碼如下:
#include <iostream> #include <fstream> #include "json/json.h" using namespace std;int main() {//// json Value的新建及key的訪問 //////cout<<"json Value的新建及key的訪問"<<endl;// 新建Json::Value對象Json::Value value1;// 給字段賦值,key必須為string型// 類似STL的map,訪問一個不存在的字段時會自動新建一個字段 value1["name"] = "英語"; // string型Json::Value value2;value2["name"] = "語文"; // string型value2["score"] = 80; // 整型value2["right"] = true; // bool型value2["percent"] = 12.34567890; // double型value2["count"]; // 單純的訪問一個key,由于該key不存在,所以會新建,值的類型為Json::nullValue// 新建Value對象Json::Value valueArr;valueArr["name"] = "json array"; // string型valueArr["object"] = value1; // json::Value型valueArr["array"].append("array_element_one"); // 訪問key為"array",該key不存在,會新建,類型為Json::arrayValue,數(shù)組型,且把第一個元素賦值為string型"array element one"valueArr["array"].append("array_element_two"); // 該key已存在,往后面增加元素,賦值為string型"array element two"valueArr["array"].append(33333); // 該key已存在,往后面增加元素,賦值為整型33333valueArr["array"].append(value2); // 該key已存在,往后面增加元素,賦值為json::Value型// 計算其中字段的個數(shù)cout<<"size = "<<valueArr.size()<<endl;// key的訪問// 訪問字段"object"的值,訪問一個key前,先預(yù)判是否有該keyif (valueArr.isMember("object")){// 存在的話,再判斷其value的類型是否是自己預(yù)期的,根據(jù)前面32行賦值代碼可知:"object"的值是Json::Value類型if (valueArr["object"].isObject()){// 轉(zhuǎn)換成對應(yīng)的類型Json::Value object = valueArr["object"];// 字段檢測,取值,可以放在一行中,謹(jǐn)記:先檢測是否存在,后判斷類型if (object.isMember("name") && object["name"].isString()){string name = object["name"].asString();cout<<"valueArr[object] key = name, value = "<< name.c_str()<<endl;}} }// 訪問字段"array"的值if (valueArr.isMember("array") && valueArr["array"].isArray()) // 根據(jù)前面33行賦值代碼可知:"object"的值是Json::arrayValue類型的{// 注意:雖然類型為Json::arrayValue,也是轉(zhuǎn)換為Json::Value類型的Json::Value arrayObject = valueArr["array"];// 得到其元素個數(shù)int array_size = arrayObject.size();// 根據(jù)類型,逐個輸出元素for(int i=0; i<array_size; i++){// 若是Json::Value型if (arrayObject[i].isObject()){// 轉(zhuǎn)換成對應(yīng)的類型Json::Value object = arrayObject[i];// 字段檢測,取值if (object.isMember("score") && object["score"].isInt()){int score = object["score"].asInt();cout<<"valueArr[array][" << i <<"]" << " key = score, value = "<< score<<endl;}// 字段檢測,取值if (object.isMember("percent") && object["percent"].isDouble()){double percent = object["percent"].asDouble();cout<<"valueArr[array][" << i <<"]" << " key = percent, value = "<< percent<<endl;}}// 若是string類型if (arrayObject[i].isString()){cout<<"valueArr[array][" << i <<"] value is " << arrayObject[i].asString()<<endl;}// 若是整型if (arrayObject[i].isInt()){cout<<"valueArr[array][" << i <<"] value is " << arrayObject[i].asInt()<<endl;}}}cout<<"\n\n"<<endl;/// 把Json::Value轉(zhuǎn)換成字符串 ////cout<<"把Json::Value轉(zhuǎn)換成字符串"<<endl;cout<<valueArr.toStyledString()<<endl;cout<<"\n\n"<<endl;/// 從字符串中解析出json::Value ////cout<<"從字符串中解析出json::Value"<<endl;// 要解析的json字符串std::string strValue = "{\"key1\":\"value1\",\"array\":[{\"key2\":\"value2\"},{\"key2\":999},{\"key2\":\"value4\"}]}";// json對象Json::Value value3;// 開始解析json,解析后的json對象存儲在value中,成功返回trueJson::Reader reader;if (reader.parse(strValue, value3)){ // 字段key1if (value3.isMember("key1") && value3["key1"].isString()){cout<<"value3[key1] = "<<value3["key1"].asString()<<endl;}// 字段arrayif (value3.isMember("array") && value3["array"].isArray()){Json::Value valueArray = value3["array"];for (int i=0; i<valueArray.size(); i++){if (valueArray[i].isObject() && valueArray[i].isMember("key2") && valueArray[i]["key2"].isString()){cout<<"value3[array]["<<i<<"].[key2] = "<<valueArray[i]["key2"].asString()<<endl;}if (valueArray[i].isObject() && valueArray[i].isMember("key2") && valueArray[i]["key2"].isInt()){cout<<"value3[array]["<<i<<"].[key2] = "<<valueArray[i]["key2"].asInt()<<endl;}}}}cout<<"\n\n"<<endl;///// 把json::Value寫入到文件中 ////cout<<"把json::Value寫入到文件中"<<endl;ofstream ofs;ofs.open("test.json");// 第一種辦法:直接輸出,帶縮進(jìn),效果等同于第三種辦法//ofs << valueArr.toStyledString();// 第二種辦法:快速輸出,沒有格式//Json::FastWriter fw;//ofs<<fw.write(valueArr)<<endl;// 第三種辦法:縮進(jìn)輸出Json::StyledWriter sw;ofs<<sw.write(valueArr)<<endl;ofs.close();cout<<"輸出到文件完畢"<<endl;cout<<"\n\n"<<endl;///// 從文件中讀取json::Value ////cout<<"從文件中讀取到j(luò)son:value"<<endl;ifstream ifs;ifs.open("test.json");Json::Value value4;Json::Reader jsonReader;if (jsonReader.parse(ifs, value4)){// 得到字段的個數(shù)cout<<"size = "<<value4.size()<<endl;// 訪問if (valueArr.isMember("name") && valueArr["name"].isString()){cout<<"valueArr[name] = "<<valueArr["name"].asString()<<endl; }}getchar();return 0; }五. Linux下的編譯
1. ? 在linux下編譯jsoncpp需要使用scons,一個類似make的編譯工具。安裝scons需要pyhon,centos系統(tǒng)自帶python,如果沒有請自行安裝,這個簡單,注意pyhon版本需為2.7或者以下
2. ? 安裝scons,下載地址 http://download.csdn.net/detail/yzf279533105/9915884。筆者這里是下載到/home/scons/ 目錄下。進(jìn)入目錄 /home/scons/,執(zhí)行解壓縮命令 tar -zxvf scons-2.5.1.tar.gz。設(shè)置兩個環(huán)境變量 export MYSCONS=/home/scons/scons-2.5.1 ,export SCONS_LIB_DIR=$MYSCONS/engine 。這兩個環(huán)境變量至關(guān)重要
3. ? 編譯jsoncpp,筆者這里是下載到/home/jsoncpp/ 目錄下。進(jìn)入目錄 /home/jsoncpp/,執(zhí)行解壓縮命令 tar -zxvf jsoncpp-src-0.5.0.tar.gz,再進(jìn)入目錄 /home/jsoncpp/jsoncpp-src-0.5.0/,執(zhí)行編譯命令?python $MYSCONS/script/scons platform=linux-gcc,即可編譯jsoncpp,隨后會生成靜態(tài)庫和動態(tài)庫文件,在目錄jsoncpp-src-0.5.0/libs/linux-gcc-4.4.7中。分別是靜態(tài)庫libjson_linux-gcc-4.4.7_libmt.a,動態(tài)庫libjson_linux-gcc-4.4.7_libmt.so
六. Linux下的使用
1. ? 代碼與步驟四中windows下的代碼完全相同,需編寫makefile,示例代碼中有
2. ? Linux下示例代碼下載地址:http://download.csdn.net/detail/yzf279533105/9915877
總結(jié)
以上是生活随笔為你收集整理的jsoncpp在linux和windows下的编译及使用详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jsoncpp判断Value中是否含有指
- 下一篇: tinyxml在linux和window