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

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)

{
  "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);
  //创建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、服务器端:

#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;
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c++
, json
jsoncpp
jsoncpp 使用详解、jsoncpp 详解、jsoncpp 静态库报错、易语言json静态支持库、jsoncpp,以便于您获取更多的相关知识。

时间: 2024-09-30 14:46:49

详解C++的JSON静态链接库JsonCpp的使用方法_C 语言的相关文章

详解C语言中symlink()函数和readlink()函数的使用_C 语言

C语言symlink()函数:建立文件符号连接头文件: #include <unistd.h> 定义函数: int symlink(const char * oldpath, const char * newpath); 函数说明:symlink()以参数newpath 指定的名称来建立一个新的连接(符号连接)到参数oldpath 所指定的已存在文件. 参数oldpath 指定的文件不一定要存在, 如果参数newpath 指定的名称为一已存在的文件则不会建立连接. 返回值:成功则返回0, 失败

详解C语言中free()函数与getpagesize()函数的使用_C 语言

C语言free()函数:释放动态分配的内存空间头文件: #include <stdlib.h> free() 函数用来释放动态分配的内存空间,其原型为: void free (void* ptr); free() 可以释放由 malloc().calloc().realloc() 分配的内存空间,以便其他程序再次使用. [参数说明]ptr 为将要释放的内存空间的地址. free() 只能释放动态分配的内存空间,并不能释放任意的内存.下面的写法是错误的: int a[10]; // ... fr

详解C语言中getgid()函数和getegid()函数的区别_C 语言

C语言getgid()函数:取得组识别码函数 头文件: #include <unistd.h> #include <sys/types.h> 定义函数: gid_t getgid(void); 函数说明:getgid()用来取得执行目前进程的组识别码. 返回值:返回组识别码 范例 #include <unistd.h> #include <sys/types.h> main() { printf("gid is %d\n", getgid

详解C++中的增量运算符++和减量运算符--的用法_C 语言

前缀增量和减量运算符:++ 和 --  语法 ++ unary-expression –– unary-expression 备注 前缀递增运算符 (++) 向其操作数添加 1:此递增值是表达式的结果.操作数必须是类型不为 const 的左值.结果是与操作数相同类型的左值. 前缀递减运算符 (––) 与前缀递增运算符类似,只不过操作数将减少 1,并且结果是递减值. 前缀和后缀递增和递减运算符均会影响其操作数.它们之间的主要差异是递增或递减在表达式的计算中出现的顺序.在前缀形式中,将在表达式计算中

详解C++中的指针、数组指针与函数指针_C 语言

C++中一个重要的特性就是指针,指针不仅具有获得地址的能力,还具有操作地址的能力.指针可以用于数组.或作为函数的参数,用来访问内存和对内存的操作,指针的使用使得C++很高效,但是指针也非常危险,使用不当会带来比较严重的问题. 1.指针 程序中所有的变量和常量都存在一个内存地址中,当然,函数也有对应的内存地址,内存地址的不同会导致程序执行时有所不同. 指针就是用来控制和存储内存地址的变量,它指向单个对象的地址,除了void之外,指针的数据类型与所指向地址的变量数据类型保持一致. 2.如何定义指针.

详解C语言中freopen()函数和fclose()函数的用法_C 语言

C语言freopen()函数:打开文件函数,并获得文件句柄 头文件: #include <stdio.h> 定义函数: FILE * freopen(const char * path, const char * mode, FILE * stream); 函数说明: 参数 path 字符串包含欲打开的文件路径及文件名. 参数mode 请参考fopen()说明.. 参数stream 为已打开的文件指针. Freopen()会将原stream 所打开的文件流关闭, 然后打开参数path 的文件.

详解C++编程中类的声明和对象成员的引用_C 语言

C++类的声明和对象的创建 类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量:创建对象的过程也叫类的实例化.每个对象都是类的一个具体实例(Instance),拥有类的成员变量和成员函数. 与结构体一样,类只是一种复杂数据类型的声明,不占用内存空间.而对象是类这种数据类型的一个变量,占用内存空间. 类的声明 类是用户自定义的类型,如果程序中要用到类,必须先进行声明,或者使用已存在的类(别人写好的类.标准库中的类等),C++语法本身并不提供现成的类的名称.结构和内容. 一个简

详解C语言中scanf函数使用的一些注意点_C 语言

 (一)基本介绍 Scanf是系统自带的函数,声明包含在stdio.h文件中,因此要是有该函数,必须加载#include<stdio.h>头文件.当执行到scanf函数时,程序就暂停等待用户输入,该函数只接受变量的地址,格式为&变量名.是一个阻塞式的函数,2用户输入完毕后,则将值赋值给变量,至此函数调用完毕.敲回车键告知计算机键入完毕. (二)使用注意 ①. 使用scanf函数输入一个字符变量.Char a; scanf("%c",&a); ②. 同时输入多

详解C++设计模式编程中策略模式的优缺点及实现_C 语言

策略模式(Strategy):它定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法的变化不会影响到使用算法的客户.策略模式和 Template 模式要解决的问题是相同(类似)的,都是为了给业务逻辑(算法)具体实现和抽象接口之间的解耦.策略模式将逻辑(算法)封装到一个类(Context)里面,通过组合的方式将具体算法的实现在组合对象中实现,再通过委托的方式将抽象接口的实现委托给组合对象实现.State 模式也有类似的功能,他们之间的区别将在讨论中给出. UML图