详解C++的JSON静态链接库JsonCpp的使用方法
JsonCpp部署方法:
在http://sourceforge.net/projects/jsoncpp/中下载最新版本的jsoncpp库源码。
之后将jsoncpp-src-版本号-tar.gz解压出来,打开makefiles中的jsoncpp.sln进行编译,之后build文件夹下的vs71\debug\lib_json中会有一个.lib静态链接库。
JsonCpp主要包含三种类型的class:ValueReaderWriter。
jsoncpp中所有对象、类名都在namespacejson中,包含json.h即可
- Json::Value :可以表示所有支持的类型,如:int,double,string,object等
- Json::Reader:将文件流或字符串创解析到Json::Value中,主要使用parse函数。
- Json::Writer : 与JsonReader相反,将Json::Value转换成字符串流等。
注意:Jsoncpp的Json::Writer类是一个纯虚类,并不能直接使用。在此我们使用Json::Writer的子类:Json::FastWriter、Json::StyledWriter、Json::StyledStreamWriter。
反序列化Json(解析Json)
{ "name":"xiaoming″, "like":[ { "book":"json" }, { "food":"apple" }, { "music":"sdds" } ] } voidReadJson() { std::stringstrValue="{\"name\":\"xiaoming\",\"like\":[{\"book\":\"json\"},{\"food\":\"apple\"},{\"music\":\"sdds\"}]}"; Json::Readerreader; Json::Valuevalue; if(reader.parse(strValue,value)) { std::stringout=value["name"].asString(); std::cout<<out<<std::endl; constJson::ValuearrayObj=value["like"]; for(unsignedinti=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):
voidWriteJson() { Json::Valueroot; Json::ValuearrayObj; Json::Valueitem; item["food"]="apple"; item["music"]="JZhou"; item["book"]="json"; arrayObj.append(item); root["name"]="xiaoming"; root["like"]=arrayObj; root.toStyledString(); std::stringout=root.toStyledString(); std::cout<<out<<std::endl; }
通过JSON方式的socket传输
1、客户端:
#include"json//json.h" #include<WinSock2.h> #pragmacomment(lib,"WS2_32.lib") #pragmacomment(lib,"json_vc71_libmtd.lib") intmain() { Json::Valueval; Json::StyledWriterstyle_write; val["name"]="xiaoli"; WSADATAwsaData; SOCKETSendSocket; sockaddr_inRecvAddr; intPort=27015; //初始化Socket WSAStartup(MAKEWORD(2,2),&wsaData); //创建Socket对象 SendSocket=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); //设置服务器地址 RecvAddr.sin_family=AF_INET; RecvAddr.sin_port=htons(Port); RecvAddr.sin_addr.s_addr=inet_addr("127.0.0.1"); std::stringSendBuf=style_write.write(val); //向服务器发送数据 sendto(SendSocket,SendBuf.c_str(),SendBuf.size(),0,(SOCKADDR*)&RecvAddr,sizeof(RecvAddr)); closesocket(SendSocket); WSACleanup(); getchar(); return0; }
2、服务器端:
#include<iostream> #include<WinSock2.h> #include"json/json.h" #pragmacomment(lib,"WS2_32.lib") #pragmacomment(lib,"json_vc71_libmtd.lib") intmain() { //初始化socket WSADATAwsaData; WSAStartup(MAKEWORD(2,2),&wsaData); //创建socket SOCKETRecvSocket; RecvSocket=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); //设置服务器地址 sockaddr_inRecvAddr; intPort=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)); charRecvBuf[1024]; intBufLen=1024; sockaddr_inSenderAddr; intSendAddrSize=sizeof(SenderAddr); recvfrom(RecvSocket,RecvBuf,BufLen,0,(SOCKADDR*)&SenderAddr,&SendAddrSize); std::stringstrName; Json::Valueval; Json::Readerreader; if(reader.parse(RecvBuf,val)) { strName=val["name"].asString(); } std::cout<<strName<<std::endl; closesocket(RecvSocket); WSACleanup(); getchar(); return0; }