1. 程式人生 > >JSON (JavaScript Object Notation) 是一種輕量級的資料交換格式 --==- 附上可以編譯的程式

JSON (JavaScript Object Notation) 是一種輕量級的資料交換格式 --==- 附上可以編譯的程式

最近因為團隊需要 我做了一個爬蟲,爬蟲的需求很簡單 1. Login 網頁->得到資料->分析->傳送一個請求命令    主要的資料全是Json , 近期整理出來,關於部分資料的整理  Python 準備融合到C++裡面,這樣我就可以減輕HTTP那些噁心的c++封裝,純屬偷懶 下面這小段程式是官方的,編譯不過,如果你有編譯過的,記得抄送我一份 const Json::Value plugins = root["plug-ins"]; for ( int index = 0; index < plugins.size(); ++index )  // Iterates over the sequence elements.    loadPlugIn( plugins[index].asString() ); setIndentLength( root["indent"].get("length", 3).asInt() ); setIndentUseSpace( root["indent"].get("use_space", true).asBool()  上面這段Code Example 真是... 下面上程式碼 設計思路: 生成一個Json檔案->存檔->讀取(普通 和 陣列都有) // jsonLibRe.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include <iostream> #include <fstream>  #include <string> #include <Windows.h> #include "json.h" TCHAR szFullConfName[2*MAX_PATH + 1] = {0}; void saveStringToFile(std::string szSaveString) { TCHAR szFilePath[MAX_PATH + 1]; GetModuleFileName(NULL, szFilePath, MAX_PATH);  (_tcsrchr(szFilePath, _T('\\')))[1] = 0;//刪除檔名,只獲得路徑 TCHAR str_url[2*MAX_PATH + 1] = {0}; lstrcat(str_url, szFilePath);lstrcat(str_url, _T("msg.json") ); //only for loglstrcat(szFullConfName, str_url); // std::ofstream otof(str_url); otof<< szSaveString; otof.flush();otof.close(); } int main(int argc, char* argv[]) { //解析jsonJson::Value jsRoot; Json::Value jsArray;Json::Value jsItem; for (int i = 0; i < 10 ; i++ ){ jsItem["id"] = i;jsItem["Name"] = "農田"; jsArray.append(jsItem);} jsRoot["FirstName"] = "Eagle";jsRoot["LastName"] = "Zhao"; std::string szShowCurrJSON = jsRoot.toStyledString();//std::cout<< szShowCurrJSON <<std::endl; //std::cout<< "--==========================================--" <<std::endl; //szShowCurrJSON.empty();//szShowCurrJSON = jsArray.toStyledString(); //std::cout<< szShowCurrJSON <<std::endl;//std::cout<< "--==========================================--" <<std::endl; jsRoot["JSONArray"] = jsArray;szShowCurrJSON.empty(); szShowCurrJSON = jsRoot.toStyledString();//std::cout<< szShowCurrJSON <<std::endl; std::cout<< "--==========================================--" <<std::endl; //save JSON to filesaveStringToFile(szShowCurrJSON); //--======================Reader file====================================--// Reader file and show Json Json::Value jsReadValue;std::ifstream in(szFullConfName); std::string szReadstr;std::string szReadmsg; if(in.is_open()){ while(in>>szReadstr)szReadmsg += szReadstr; } Json::Reader jsReader; int ret = jsReader.parse(szReadmsg,jsReadValue); if(ret){  std::string FN = jsReadValue["FirstName"].asString();std::string LN = jsReadValue["LastName"].asString(); std::cout<<FN <<std::endl;std::cout<<LN <<std::endl; /**[["key1":value1],["key2":value2] ] **/Json::Value jsArrayReaderValue ; jsArrayReaderValue = jsReadValue["JSONArray"];int iASize =  jsArrayReaderValue.size(); for ( int i=0; i < iASize;i++ ){ int nID = jsArrayReaderValue[i]["id"].asInt();std::string szName = jsArrayReaderValue[i]["Name"].asString(); std::cout<<szName <<nID << std::endl;} } in.close();return 0; } /** //////////////本文設計的Jason 檔案內容,程式會自動生成:////////////// { "FirstName" : "Eagle", "JSONArray" : [ { "Name" : "農田", "id" : 0 }, { "Name" : "農田", "id" : 1 }, { "Name" : "農田", "id" : 2 }, { "Name" : "農田", "id" : 3 }, { "Name" : "農田", "id" : 4 }, { "Name" : "農田", "id" : 5 }, { "Name" : "農田", "id" : 6 }, { "Name" : "農田", "id" : 7 }, { "Name" : "農田", "id" : 8 }, { "Name" : "農田", "id" : 9 } ], "LastName" : "Zhao" } ///////////////////////////////////////////////////////////////////////////// 下面的收集來自與網路 http://api.minicloud.com.cn/statuses/public_timeline.json返回的格式為無名陣列。 那麼又該如何解析呢? 參考程式碼如下   reader.parse(apiret,value);     for(int i = 0;i < value.size();++i)   {string text = value[i]["text"].asString(); cout<<text<<endl;} json對陣列的解析還支援STL的風格。即 Json::Value::Members member;//Members  這玩意就是vector<string>,typedef了而已for (Json::Value::iterator itr = objArray.begin(); itr != objArray.end(); itr++) {member = (*itr).getMemberNames(); for (Json::Value::Members::iterator iter = member.begin(); iter != member.end(); iter++){ string str_temp = (*itr)[(*iter)].asString();} } **/