|
http://blog.csdn.net/chenziwen/article/details/5785932 Json大家都耳熟能詳了吧?現(xiàn)在Json廣泛用于各類通信,特別是基于Http協(xié)議的通信,一般的服務(wù)端動(dòng)態(tài)腳本語(yǔ)言都有庫(kù)支持Json的編碼與 解碼。但很少有聽過(guò)Json被C++使用來(lái)作為通信的格式,不過(guò)去了http://www./上面看 了,已經(jīng)有很多C++的庫(kù)來(lái)支持Json的編碼和解碼,因?yàn)橐粋€(gè)小東西要用到,最后使用的是Jsoncpp這個(gè)庫(kù)。 看到Jsoncpp的主頁(yè)上介紹說(shuō),Jsoncpp是Json數(shù)據(jù)格式的編碼解碼器,提供reader和writer來(lái)進(jìn)行解碼和編碼。下面就簡(jiǎn)要 的介紹Jsoncpp里頭的玩意: 1.Reader 2.Value 3.Writer 4.FastWriter 我暫時(shí)用到的是以上的這些類,該庫(kù)還提供處理Json字串的注釋,提供style來(lái)格式化Json字串是的更容易人閱讀等功能,這些都沒有用到,等 以后用到了再來(lái)分享。下面用一段簡(jiǎn)短的代碼來(lái)看以上這些Jsoncpp的基本功能:
C++語(yǔ)言:
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 } 上面這段代碼還是相對(duì)用到了jsoncpp的大部分編碼功能的,用來(lái)將數(shù)據(jù)編碼稱為json字符串,下面會(huì)仔細(xì)的分析這段代碼 1.首先請(qǐng)看注釋中的!IN部分,這是這個(gè)函數(shù)的傳入?yún)?shù)。有三個(gè)一個(gè)是string類型的token,一個(gè)是int類型的game_id,一個(gè)是 array,用來(lái)存儲(chǔ)所有的piece???OUT部分就是所要輸出的json格式的字符串。用后面的輸出可以看到,這個(gè)Json字符串中有一個(gè)大的根 object,里頭有三樣?xùn)|西,1.token,2.game_id,3.piece_array。 2.encode過(guò)程 3.encode 再來(lái)看一段解碼json串的代碼
C++語(yǔ)言:
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ù)的輸入和輸出,下面簡(jiǎn)要的分析一下這段代碼 1.parse,這個(gè)函數(shù)在上面的介紹中已經(jīng)寫過(guò),是用來(lái)解碼字串稱為Value格式的數(shù)據(jù)的函數(shù),然后是要判斷函數(shù)的返回值,如果返回為 false,那么說(shuō)明json字串解碼錯(cuò)誤。 2.當(dāng)解碼成功以后,就是要操作返回的Value值。這里對(duì)于如何取Value里頭的值,Jsoncpp的Value類提供了兩個(gè)方法,一個(gè)是 get函數(shù),第二個(gè)是[]操作符,我個(gè)人覺得還是[]好用,傳入的參數(shù)的json里頭的key,你就可以把key所對(duì)應(yīng)的value取出來(lái) 3.當(dāng)提取出來(lái)的是數(shù)組時(shí),需要逐個(gè)提取里面的元素,然后再用Value的轉(zhuǎn)換功能來(lái)實(shí)現(xiàn)值的提取。Value提供asXXX函數(shù)來(lái)轉(zhuǎn)換值。 以上的是簡(jiǎn)要的介紹了Jsoncpp里頭的編碼和解碼功能。 |
|
|
來(lái)自: 昵稱38871991 > 《待分類》