http://blog.csdn.net/chenziwen/article/details/5785932 Json大家都耳熟能詳了吧?現(xiàn)在Json廣泛用于各類通信,特別是基于Http協(xié)議的通信,一般的服務端動態(tài)腳本語言都有庫支持Json的編碼與 解碼。但很少有聽過Json被C++使用來作為通信的格式,不過去了http://www./上面看 了,已經(jīng)有很多C++的庫來支持Json的編碼和解碼,因為一個小東西要用到,最后使用的是Jsoncpp這個庫。 看到Jsoncpp的主頁上介紹說,Jsoncpp是Json數(shù)據(jù)格式的編碼解碼器,提供reader和writer來進行解碼和編碼。下面就簡要 的介紹Jsoncpp里頭的玩意: 1.Reader 2.Value 3.Writer 4.FastWriter 我暫時用到的是以上的這些類,該庫還提供處理Json字串的注釋,提供style來格式化Json字串是的更容易人閱讀等功能,這些都沒有用到,等 以后用到了再來分享。下面用一段簡短的代碼來看以上這些Jsoncpp的基本功能:
C++語言:
01
21 string encode_game_play_msg(string token,int game_id,vector<piece> piece_array){ 22 Json::Value root; 23 Json::Value var; 24 25 //apply “token” and “game_id” value to json struct 26 var["token"] = token; 27 var["game_id"] = game_id; 28 29 Json::Value pieces;//store all pieces 30 for (int i=0;i < piece_array.size();i++) 31 { 32 Json::Value piece_ex;//here it store just one piece 33 34 //next 4 lines to apply piece value to json struct 35 piece_ex["letter"] = piece_array[i].letter; 36 piece_ex["wild"] = piece_array[i].wild; 37 piece_ex["x"] = piece_array[i].x; 38 piece_ex["y"] = piece_array[i].y; 39 pieces.append(piece_ex);//ok,yes we just have apply One piece ,then push back to the array 40 } 41 var["piece_array"] = pieces;//yes,store pieces in var [Value] 42 root.append(var); 43 44 Json::FastWriter writer; 45 return writer.write(var);//generate json string:),here all is done 46 } 上面這段代碼還是相對用到了jsoncpp的大部分編碼功能的,用來將數(shù)據(jù)編碼稱為json字符串,下面會仔細的分析這段代碼 1.首先請看注釋中的!IN部分,這是這個函數(shù)的傳入?yún)?shù)。有三個一個是string類型的token,一個是int類型的game_id,一個是 array,用來存儲所有的piece???OUT部分就是所要輸出的json格式的字符串。用后面的輸出可以看到,這個Json字符串中有一個大的根 object,里頭有三樣東西,1.token,2.game_id,3.piece_array。 2.encode過程 3.encode 再來看一段解碼json串的代碼
C++語言:
01
30 game_info decode_lobby_data_return_msg(string lobby_data_return_msg){ 31 Json::Value root; 32 Json::Reader reader; 33 game_info gi; 34 bool parsedOk = false; 35 parsedOk = reader.parse(lobby_data_return_msg,root,false);//decoding… 36 if (!parsedOk)//decoded failed 37 { 38 cout<<“parsed error!n“<<reader.getFormatedErrorMessages 39 gi.id = -1000;//game id = -1000,means parsed error! 40 return gi; 41 } 42 43 Json::Value game = root["game"]; 44 49 gi.id = game["id"].asInt(); 50 gi.creator_id = game["creator_id"].asInt(); 51 gi.user_max = game["user_max"].asInt(); 52 53 Json::Value template_r = game["template"]; 54 gi.template_r.id = template_r["id"].asInt(); 55 56 Json::Value users = game["user_array"];//because user_array is a array ,so we must get its element by [for] circle,please see [for] circle below 57 for (int index=0;index < users.size();index++) 58 { 59 63 user_info u; 64 u.id = users[index]["id"].asInt(); 65 u.name = users[index]["name"].asString(); 66 gi.user_array.push_back(u); 67 } 68 69 return gi; 70 } 這是一段典型的解碼json字符串的代碼,注釋中已經(jīng)非常明白的寫出了該函數(shù)的輸入和輸出,下面簡要的分析一下這段代碼 1.parse,這個函數(shù)在上面的介紹中已經(jīng)寫過,是用來解碼字串稱為Value格式的數(shù)據(jù)的函數(shù),然后是要判斷函數(shù)的返回值,如果返回為 false,那么說明json字串解碼錯誤。 2.當解碼成功以后,就是要操作返回的Value值。這里對于如何取Value里頭的值,Jsoncpp的Value類提供了兩個方法,一個是 get函數(shù),第二個是[]操作符,我個人覺得還是[]好用,傳入的參數(shù)的json里頭的key,你就可以把key所對應的value取出來 3.當提取出來的是數(shù)組時,需要逐個提取里面的元素,然后再用Value的轉(zhuǎn)換功能來實現(xiàn)值的提取。Value提供asXXX函數(shù)來轉(zhuǎn)換值。 以上的是簡要的介紹了Jsoncpp里頭的編碼和解碼功能。 |
|
來自: 昵稱38871991 > 《待分類》