数组、 布尔值和 null

发布时间:2025-06-24 18:48:57  作者:北方职教升学中心  阅读量:266


  • 高性能: Jsoncpp 的性能经过优化, 能够高效地处理大量 JSON 数据。

    在这里插入图片描述

    唯有梦想才配让你不安,
    唯有行动才能解除你的不安。 数组、 布尔值和 null。 它提供了将 JSON 数据序列化为字符串以及从字符串反序列化为 C++ 数据结构的功能。分别作为传入的数据和传出的数据:

    1. Request:两个数字和一个运算符
    2. Response:结果数字 , 错误码 ,退出信息

    他们是作为结构化的数据进行传输,那么想要进行传输就来到了最重要的部分序列化与反序列化!序列化与反序列化可以使用第三方库也可以自己进行编写。这里我们先使用第三方的Json库进行实现:

    Jsoncpp 是一个用于处理 JSON 数据的 C++ 库。再调用回调函数对数据进行操作!得到结果之后就可以进行序列化,加入报头,再发送给客户端!

  • 应用层的操作逻辑,Service并不关心,只要回调函数可以传回需要的结构体就可以!
  • classService{public:Service(process_t process):_process(process){}voidIOExecute(SockSPtr sock,InetAddr &addr){LOG(INFO,"service start!!!\n");std::string message;while(true){// 1. 进行读取ssize_t n =sock->Recv(&message);if(n <0){LOG(ERROR,"read error: %sn",addr.AddrStr().c_str());break;}// 此时获取到客户端发送的数据// 但是不能保证是否是完整的报文// 2.报文解析std::string str =Decode(message);// 通过去报头获取报文if(str.empty())continue;// 说明没有完整的报文!// 到这里说明有完整的报文!!!autoreq =Factory::BuildRequestDefault();// 3.反序列化初始化Requestreq->Deserialize(str);autores =Factory::BuildResponseDefault();// 4.业务处理res =_process(req);// 5.进行序列化处理std::string ret;res->Serialize(&ret);// 6.加入报头Encode(ret);// 7.将获取的数据发送回去sock->Send(ret);}}~Service(){}private:process_t _process;};

    4 应用层 — 网络计算器

    应用层根据具体需要可以随时改变,我这里以网络计算器为例子进行书写:

    #include"Protocol.hpp"classNetCal{public:NetCal(){}std::shared_ptr<Response>Calculator(std::shared_ptr<Request>req){std::shared_ptr<Response>res =Factory::BuildResponseDefault();switch(req->Oper()){case'+':res->_res =req->X()+req->Y();res->_code =0;res->_desc ="success";break;case'-':res->_res =req->X()-req->Y();res->_code =0;res->_desc ="success";break;case'*':res->_res =req->X()*req->Y();res->_code =0;res->_desc ="success";break;case'/':{if(req->Y()==0){res->_code =1;res->_desc ="div zero";}res->_res =req->X()/req->Y();res->_code =0;res->_desc ="success";}break;case'%':{if(req->Y()==0){res->_code =1;res->_desc ="mod zero";}res->_res =req->X()%req->Y();res->_code =0;res->_desc ="success";}break;default:res->_code =2;res->_desc ="illegal operations";break;}returnres;}~NetCal(){}};

    逻辑很简单不在多加赘述!

    5 总结

    现在我们的程序分为了三层结构:
    在这里插入图片描述
    我们做到了最大程度的解耦!

    • 传输层只负责获取链接,我们应用层要进行什么工作,只要是进行网络通信传输层的工作就是唯一的!
    • 会话层进行IO操作!只要传输层提供了链接,会话层就可以获取数据,然后根据具体的协议进行数据的解析工作。 Jsoncpp 是开源的, 广泛用于各种需要处理 JSON 数据的 C++ 项目中:

      1. 简单易用: Jsoncpp 提供了直观的 API, 使得处理 JSON 数据变得简单。 字符串、并通过传输层的底层理解了为什么read系列函数时全双工支持同时读写的:TCP传输层有两个缓冲区,分别接收和发送。
        --- 卢思浩 ---

    从零开始掌握序列化

    • 1 知识回顾
    • 2 序列化与编写协议
      • 2.1 使用Json进行序列化
      • 2.2 编写协议
    • 3 封装IOService
    • 4 应用层 --- 网络计算器
    • 5 总结

    1 知识回顾

    上一篇文章我们讲解了协议的本质是双方能够看到的结构化数据。

  • 全面支持: 支持 JSON 标准中的所有数据类型, 包括对象、协议根据实际情况改变,但是会话层的工作逻辑是不变的!
  • 应用层只管进行数据处理即可,什么但不不需要考虑!完成工作后返回给会话层数据即可!
  • 这样的结构逻辑十分清晰,并且解耦的非常优雅,值得反复品味!!!