当前位置: 首页 > news >正文

Linux系统C++开发专业的工具(四)—— jsoncpp 使用指南

文章目录

  • 概念简述
  • 数据存取
  • 序列化
  • 反序列化
  • 示例

概念简述

JSON 的全称是 JavaScript Object Notation。

  • 核心定义:它是一种轻量级的数据交换格式,用来做序列化与反序列化

  Json格式可辅助解决 TCP 传输中的粘包问题,粘包——发送方连续发送多个独立数据包,接收方可能一次性读取到合并数据。比如发送6和7,接收到67。
  对于粘包问题,可以在数据之间添加一些标识符来区分它们,比如": ",当接收到完整的数据包后根据这些标识符就可以区分出它们。这个操作就是序列化和反序列化。
  数据包以什么格式传递是通信双方(服务器和客户端)约定好的,即协议。序列化和反序列化就是协议的一部分。
例如Json会以这样的格式记录一个学生信息:

{"姓名": "张三","年龄": 18,"成绩": [88.8,89,69.5]
}

一个花括号{}就是一个对象,方括号[ ]就是数组,对象之间可以嵌套,如一个班级的信息:

[{},{},{}]

Json的安装:

ubuntu: sudo apt-get install libjsoncpp-dev
Centos: sudo yum install jsoncpp-devel

数据存取

Json::Value类
  这个类用于进行数据中间存储。将多个字段数据进行序列化,需要将数据存储到Value对象中,若要将一个json格式的字符串反序列化,需要用该类对象来接收结果。
数据的存储
  Json::Value类里面重载了=运算符和[]运算符,可以如下方式进行数据存储:

Json::Value val;
val["姓名"]="张三";
val["年龄"]=18;
val["成绩"].append(88); //如果要存储一个数组需要用append接口
val["成绩"].append(95.5); //再次调用来新增第二个元素
......

数据的访问
  数据访问时同样用方括号[ ]运算符进行访问。在访问时用的类型有多中多样,通过接口调用来转化,如下:

val["姓名"].asString();
val["年龄"].asInt();
val["成绩"][0].asFloat();
val["成绩"][1].asFloat();
......
//对于数组的数据也可提供size()获取元素个数,然后进行遍历。

序列化

StreamWriter类
该类提供了write()接口,用来做序列化

int write(Value const& root, std::ostream* sout)

  • root:一个Json::Value对象,即需要序列化的数据
  • sour:该参数用来接收序列化的结果,通常传入std::stringstream类型
  • 注意:StreamWriter类不能自己构造,需要使用StreamWriterBulider工厂类对象构造。通过工厂类对象里面的newStreamWriter接口生成StreamWriter对象。

反序列化

CharReader类
该类提供parse()接口,用来做反序列化

bool parse(char const* beginDoc, char const* endDoc, Value* root, std::string* errs)

CharReader类也不能自己构造,需要使用CharReaderBuilder工厂类对象构造,通过工厂类里面的newCharReader接口生成CharReader类。

示例

main.cc文件

#include <json/json.h>#include <iostream>#include <sstream>bool Serialize(const Json::Value& val,std::string& out){//通过工厂类构建StreamWriterauto nsw = Json::StreamWriterBuilder().newStreamWriter();//因为工厂类在该场景中不在使用,所以构造临时对象。std::stringstream ss;int ret = nsw->write(val,&ss);if(ret != 0){std::cout<<"序列化失败";return false;}out = ss.str();return true;}bool UnSerialize(const std::string& str,Json::Value& val){auto crb = Json::CharReaderBuilder().newCharReader();std::string erro;bool ret = crb->parse(str.c_str(),str.c_str()+str.size(),&val,&erro);if(ret == false){std::cout<<"反序列化失败"<<std::endl;return false;}return true;}int main(){//构建数据Json::Value val;val["姓名"] = "张三";val["年龄"] = 18;val["成绩"].append(90);val["成绩"].append(90.5);val["成绩"].append(89.5);//序列化std::string out;Serialize(val,out);std::cout<<out<<std::endl;//反序列化Json::Value root;UnSerialize(out,root);std::cout<<root["姓名"].asString()<<std::endl;std::cout<<root["年龄"].asInt()<<std::endl;for(int i=0;i<root["成绩"].size();i++){std::cout<<root["成绩"][i]<<" ";}std::cout<<std::endl;return 0;}

makefile文件

test:main.ccg++ $^ -o $@ -std=c++17 -ljsoncpp

执行结果:
在这里插入图片描述
提示:显示的乱码是数据在转化为Json串后对中文进行了转义存储。

非常感谢您能耐心读完这篇文章。倘若您从中有所收获,还望多多支持呀!在这里插入图片描述

http://www.hn-smt.com/news/77944/

相关文章:

  • 市面上专业的聚氨酯重型包胶轮实力厂家排行哪家好
  • NeurIPS 2025 | 港中文提出COS3D:多模态融合语言与分割,创造开放词汇3D分割新范式! - 详解
  • 朝阳区婚姻律师事务所推荐:聚焦家事法律服务的专业参考
  • 北京陪诊机构排名揭晓 守嘉陪诊以专业实力领跑行业
  • 2025年12月成都房产典当公司推荐排行榜:五家持牌机构对比分析
  • 【大数据高并发核心场景实战】缓存层 - 读缓存
  • 仓库管理软件哪家强?2025年10款热门工具全解析,帮你告别Excel乱局
  • 1130面向对象
  • 寻客精灵联系方式:了解AI营销系统功能与注意事项
  • 寻客精灵联系方式:企业数字化营销工具使用指南
  • 2025牙医联合背书!去除牙垢牙黄美白效果超好牙膏排行榜​TOP15,第一名臻芙宁
  • 逐梦菁英(成都)电竞发展有限公司 联系方式:电竞培训行业常见风险提示
  • 鑫盛黄金加工回收(西北路店) 联系方式: 黄金回收服务特点与风险提示
  • 2025年11月河南省配电柜设备推荐排行榜:专业评测与选购指南
  • 2025年扬州公务员培训公司权威推荐榜单:考公培训班‌/公考培训班‌/公考培训‌源头公司精选
  • 上海geo优化公司避坑+优选清单
  • 完整教程:Notepad++ 全面快捷键指南(2025 最新版)
  • 2025年北京电销呼叫中心平台权威推荐榜单:北京电销卡公司/北京电销外呼系统服务/北京电销外呼优化方案服务精选
  • [Vue]AntV1.7表格自带筛选确定和重置按钮位置交换
  • SpringCloud Feign首次调用慢解决方案
  • 2025成都全包装修权威推荐,资质服务双优,装修/整装/家装/房屋装修品牌选择指南
  • 回头看基础,TemplatePrompt和MessagePrompt
  • 2025年氯化镁阻化剂定制厂家权威推荐榜单:LH—Z01阻化剂‌/煤矿专用阻化剂‌/MSF—II阻化剂‌源头厂家精选
  • 后来,他长大了
  • we_will_rockyou
  • 程序的机器级表示-常数、变量、运算
  • 深入解析:打造高清3D虚拟世界|零基础学习Unity HDRP高清渲染管线(第十一天)
  • npm1300 如何导入模型
  • 2025最新小程序开发服务商推荐!云南地区权威榜单发布,技术与服务双优助力企业数字化转型
  • npm1300 的BUCK 说明