欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解C++的JSON靜態(tài)鏈接庫JsonCpp的使用方法

 更新時(shí)間:2016年03月20日 22:57:04   作者:Zuqing_Johnny  
這篇文章主要介紹了C++的JSON靜態(tài)鏈接庫JsonCpp的使用方法,演示了使用JsonCpp生成和解析JSON的方法,以及C++通過JSON方式的socket通信示例,需要的朋友可以參考下

JsonCpp部署方法:
在http://sourceforge.net/projects/jsoncpp/中下載最新版本的jsoncpp庫源碼。
之后將jsoncpp-src-版本號(hào)-tar.gz解壓出來,打開makefiles中的jsoncpp.sln進(jìn)行編譯,之后build文件夾下的vs71\debug\lib_json中會(huì)有一個(gè).lib靜態(tài)鏈接庫。


JsonCpp主要包含三種類型的class:Value Reader Writer。

jsoncpp中所有對(duì)象、類名都在namespace json中,包含json.h即可

  • Json::Value   :可以表示所有支持的類型,如:int , double ,string , object等
  • Json::Reader :將文件流或字符串創(chuàng)解析到Json::Value中,主要使用parse函數(shù)。
  • Json::Writer  :  與JsonReader相反,將Json::Value轉(zhuǎn)換成字符串流等。

注意:Jsoncpp 的 Json::Writer 類是一個(gè)純虛類,并不能直接使用。在此我們使用 Json::Writer 的子類:Json::FastWriter、Json::StyledWriter、Json::StyledStreamWriter。


反序列化Json(解析Json)

{ 
  "name": "xiaoming″, 
  "like": [ 
    { 
      "book": "json" 
    }, 
    { 
      "food": "apple" 
    }, 
    { 
      "music": "sdds" 
    } 
  ] 
} 
 
void ReadJson()  
{ 
  std::string strValue = "{\"name\":\"xiaoming\",\"like\":[{\"book\":\"json\"},{\"food\":\"apple\"},{\"music\":\"sdds\"}]}"; 
 
  Json::Reader reader; 
  Json::Value value; 
 
  if (reader.parse(strValue, value)) 
  {   
    std::string out = value["name"].asString(); 
    std::cout << out << std::endl; 
    const Json::Value arrayObj = value["like"]; 
    for (unsigned int i = 0; i < arrayObj.size(); i++) 
    {   
      if (!arrayObj[i].isMember("book"))  
        continue; 
      out = arrayObj[i]["book"].asString(); 
      std::cout << out; 
      if (i != (arrayObj.size() - 1))  
        std::cout << std::endl; 
    }   
  }   
} 


序列化Json(生成Json):

void WriteJson()  
{ 
  Json::Value root; 
  Json::Value arrayObj; 
  Json::Value item; 
 
  item["food"] = "apple"; 
  item["music"] = "JZhou"; 
  item["book"] = "json"; 
  arrayObj.append(item); 
 
  root["name"] = "xiaoming"; 
  root["like"] = arrayObj; 
 
  root.toStyledString(); 
  std::string out = root.toStyledString(); 
  std::cout << out << std::endl; 
} 

通過JSON方式的socket傳輸
1、客戶端:

#include "json//json.h" 
#include <WinSock2.h> 
 
#pragma comment(lib, "WS2_32.lib") 
#pragma comment(lib, "json_vc71_libmtd.lib") 
 
int main() 
{ 
  Json::Value val; 
  Json::StyledWriter style_write; 
 
  val["name"] = "xiaoli" ; 
 
  WSADATA wsaData; 
  SOCKET SendSocket; 
  sockaddr_in RecvAddr; 
  int Port = 27015; 
   
  //初始化Socket 
  WSAStartup(MAKEWORD(2, 2), &wsaData); 
  //創(chuàng)建Socket對(duì)象 
  SendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 
  //設(shè)置服務(wù)器地址 
  RecvAddr.sin_family = AF_INET; 
  RecvAddr.sin_port = htons(Port); 
  RecvAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); 
 
  std::string SendBuf = style_write.write(val); 
 
  //向服務(wù)器發(fā)送數(shù)據(jù) 
  sendto(SendSocket, SendBuf.c_str(), SendBuf.size(), 0, (SOCKADDR*)&RecvAddr, sizeof(RecvAddr)); 
 
  closesocket(SendSocket); 
  WSACleanup(); 
 
  getchar(); 
  return 0; 
} 

2、服務(wù)器端:

#include <iostream> 
#include <WinSock2.h> 
#include "json/json.h" 
 
#pragma comment(lib, "WS2_32.lib") 
#pragma comment(lib, "json_vc71_libmtd.lib") 
int main() 
{ 
  //初始化socket 
  WSADATA wsaData; 
  WSAStartup(MAKEWORD(2,2), &wsaData); 
  //創(chuàng)建socket 
  SOCKET RecvSocket; 
  RecvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 
  //設(shè)置服務(wù)器地址 
  sockaddr_in RecvAddr; 
  int Port = 27015; 
  RecvAddr.sin_family = AF_INET; 
  RecvAddr.sin_port = htons(Port); 
  RecvAddr.sin_addr.s_addr = htonl(INADDR_ANY); 
  //綁定socket 
  bind(RecvSocket, (SOCKADDR*)&RecvAddr, sizeof(RecvAddr)); 
 
  char RecvBuf[1024]; 
  int BufLen = 1024; 
  sockaddr_in SenderAddr; 
  int SendAddrSize = sizeof(SenderAddr); 
 
  recvfrom(RecvSocket, RecvBuf, BufLen, 0, (SOCKADDR*)&SenderAddr, &SendAddrSize); 
 
  std::string strName; 
  Json::Value val; 
  Json::Reader reader; 
  if (reader.parse(RecvBuf, val)) 
  { 
    strName = val["name"].asString(); 
  } 
 
  std::cout << strName << std::endl; 
 
  closesocket(RecvSocket); 
  WSACleanup(); 
 
  getchar(); 
  return 0; 
} 

相關(guān)文章

  • c語言5個(gè)常用的排序算法實(shí)例代碼

    c語言5個(gè)常用的排序算法實(shí)例代碼

    這篇文章主要介紹了c語言5個(gè)常用的排序算法實(shí)例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • Qt圖片繪圖類之QPixmap/QImage/QPicture詳解

    Qt圖片繪圖類之QPixmap/QImage/QPicture詳解

    這篇文章主要為大家詳細(xì)介紹了Qt圖片繪圖類中QPixmap、QImage和QPicture的使用方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-03-03
  • 詳解C語言的預(yù)處理效果

    詳解C語言的預(yù)處理效果

    這篇文章主要為大家介紹了C語言的預(yù)處理效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • C++中十種內(nèi)部排序算法的比較分析

    C++中十種內(nèi)部排序算法的比較分析

    本文給大家分享的是個(gè)人寫的一段對(duì)C++中十種內(nèi)部排序算法的比較分析的代碼,主要在于測(cè)試10種排序方法的性能,給大家參考下吧。
    2015-03-03
  • 解析C++函數(shù)的默認(rèn)參數(shù)和占位參數(shù)及較之C語言的拓展

    解析C++函數(shù)的默認(rèn)參數(shù)和占位參數(shù)及較之C語言的拓展

    這篇文章主要介紹了C++中的默認(rèn)參數(shù)和占位參數(shù)及較之C語言的拓展,需要的朋友可以參考下
    2016-03-03
  • C++異常處理的方式總結(jié)

    C++異常處理的方式總結(jié)

    C++有一套獨(dú)立的異常處理機(jī)制,相信大家一定聽說過try,catch這兩
    個(gè)詞,今天就來做詳細(xì)的介紹,文中通過代碼示例給大家介紹的非常詳細(xì),具有一定參考價(jià)值,需要的朋友可以參考下
    2023-12-12
  • C/C++詳解如何實(shí)現(xiàn)文件備份

    C/C++詳解如何實(shí)現(xiàn)文件備份

    這篇文章主要介紹了C/C++詳解如何實(shí)現(xiàn)文件備份,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • C++?requires關(guān)鍵字簡(jiǎn)單介紹

    C++?requires關(guān)鍵字簡(jiǎn)單介紹

    requires?是?C++20?中引入的一個(gè)新關(guān)鍵字,用于在函數(shù)模板或類模板中聲明所需的一組語義要求,它可以用來限制模板參數(shù),類似于?typename?和?class?關(guān)鍵字,這篇文章主要介紹了C++?requires關(guān)鍵字簡(jiǎn)介,需要的朋友可以參考下
    2023-05-05
  • 淺析C++中的重載,隱藏和覆蓋

    淺析C++中的重載,隱藏和覆蓋

    在C++語言中,函數(shù)扮演著很重要的角色,不管面向過程設(shè)計(jì),還是基于對(duì)象設(shè)計(jì)。本文主要為大家介紹了函數(shù)中重載、覆蓋和隱藏的相關(guān)知識(shí),感興趣的小伙伴可以了解一下
    2022-12-12
  • C語言中的強(qiáng)符號(hào)和弱符號(hào)介紹

    C語言中的強(qiáng)符號(hào)和弱符號(hào)介紹

    這篇文章主要介紹了C語言中的強(qiáng)符號(hào)和弱符號(hào)介紹,本文用多個(gè)實(shí)例來講解強(qiáng)符號(hào)和弱符號(hào),需要的朋友可以參考下
    2015-03-03

最新評(píng)論