详解C++的JSON静态链接库JsonCpp的使用方法

2025-05-29 0 66

JsonCpp部署方法:
在http://sourceforge.net/projects/jsoncpp/中下载最新版本的jsoncpp库源码。
之后将jsoncpp-src-版本号-tar.gz解压出来,打开makefiles中的jsoncpp.sln进行编译,之后build文件夹下的vs71\\debug\\lib_json中会有一个.lib静态链接库。


JsonCpp主要包含三种类型的class:Value Reader Writer。

jsoncpp中所有对象、类名都在namespace json中,包含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)

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38
{

"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):

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18
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、客户端:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38
#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);

//创建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::string SendBuf = style_write.write(val);

//向服务器发送数据

sendto(SendSocket, SendBuf.c_str(), SendBuf.size(), 0, (SOCKADDR*)&RecvAddr, sizeof(RecvAddr));

closesocket(SendSocket);

WSACleanup();

getchar();

return 0;

}

2、服务器端:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46
#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);

//创建socket

SOCKET RecvSocket;

RecvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

//设置服务器地址

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;

}

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 详解C++的JSON静态链接库JsonCpp的使用方法 https://www.kuaiidc.com/106128.html

相关文章

发表评论
暂无评论