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

[C++][第三方库][jsoncpp]详细讲解

目录

  • 1.介绍
  • 2.jsoncpp
  • 3.使用
    • 1.main.cc
    • 2.序列化
    • 3.反序列化


1.介绍

  • json是一种数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据
  • json数据类型:对象、数组、字符串、数字
    • 对象:使用{}括起来的表示一个对象
    • 数组:使用[]括起来的表示一个数组
    • 字符串:使用""括起来的表示一个字符串
    • 数字:包括整形和浮点型,直接使用

2.jsoncpp

  • jsoncpp库用于实现json格式的序列化和反序列化,完成将多个数据对象组织成为格式字符串解析得到多个数据对象的功能
  • 主要借助三个类以及其对应的少量成员函数完成
    // Json数据对象类 -> 用于进行中间数据存储
    class Json::Value
    {// Value重载了[]和=,因此所有的赋值和获取数据都可以通过[]实现Value &operator=(const Value &other);// 简单的方式完成 val["姓名"] = "SnowK";Value& operator[](const std::string& key);Value& operator[](const char* key);// 移除元素Value removeMember(const char* key);// val["成绩"][0]const Value& operator[](ArrayIndex index) const; // 添加数组元素val["成绩"].append(88); Value& append(const Value& value);// 获取数组元素个数 val["成绩"].size();ArrayIndex size() const;// 转string   string name = val["name"].asString();std::string asString() const;// 转char*   char *name = val["name"].asCString();const char* asCString() const;// 转int  int age = val["age"].asInt();int asInt() const;              // 转floatfloat asFloat() const;// 转 boolbool asBool() const;
    };//json序列化类,低版本用这个更简单
    class JSON_API Writer 
    {virtual std::string write(const Value& root) = 0;
    }class JSON_API FastWriter : public Writer 
    {virtual std::string write(const Value& root);
    }class JSON_API StyledWriter : public Writer 
    {virtual std::string write(const Value& root);
    }//json 序列化类,高版本推荐,如果用低版本的接口可能会有警告
    class JSON_API StreamWriter 
    {virtual int write(Value const& root, std::ostream* sout) = 0;
    }class JSON_API StreamWriterBuilder : public StreamWriter::Factory 
    {virtual StreamWriter* newStreamWriter() const;
    }// json反序列化类,低版本用起来更简单
    class JSON_API Reader 
    {bool parse(const std::string& document, Value& root, bool collectComments = true);
    }// json反序列化类,高版本更推荐
    class JSON_API CharReader 
    {virtual bool parse(char const* beginDoc, char const* endDoc, Value* root, std::string* errs) = 0;
    }class JSON_API CharReaderBuilder : public CharReader::Factory 
    {virtual CharReader* newCharReader() const;
    }
    

3.使用

1.main.cc

int main()
{char name[] = "SnowK";int age = 18;float score[3] = {100, 99, 98};Json::Value stu;stu["Name"] = name;stu["Age"] = age;stu["Score"].append(score[0]);stu["Score"].append(score[1]);stu["Score"].append(score[2]);std::string str;if(Serialize(stu, str) == false){return -1;}std::cout << str << std::endl;std::cout << "-------------------------------" << std::endl;Json::Value val;if(UnSerialize(str, val) == false){return -1;}std::cout << val["Name"].asString() << std::endl;std::cout << val["Age"].asInt() << std::endl;for (int i = 0; i < val["Score"].size(); i++){std::cout << val["Score"][i].asInt() << std::endl;}return 0;
}

2.序列化

bool Serialize(const Json::Value &val, std::string &dest)
{// 由Json::StreamWriterBuilder生产出Json::StreamWriterJson::StreamWriterBuilder swb;std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());// 通过Json::StreamWrite的write()进行序列化std::stringstream ss;if (sw->write(val, &ss) != 0){std::cout << "Json序列化失败" << std::endl;return false;}dest = ss.str();return true;
}

3.反序列化

bool UnSerialize(const std::string &src, Json::Value &val)
{Json::CharReaderBuilder crb;std::unique_ptr<Json::CharReader> cr(crb.newCharReader());std::string err;if (cr->parse(src.c_str(), src.c_str() + src.size(), &val, &err) == false){std::cout << "json反序列化失败: " << err << std::endl;return false;}return true;
}

相关文章:

[C++][第三方库][jsoncpp]详细讲解

目录 1.介绍2.jsoncpp3.使用1.main.cc2.序列化3.反序列化 1.介绍 json是一种数据交换格式&#xff0c;采用完全独立于编程语言的文本格式来存储和表示数据json数据类型&#xff1a;对象、数组、字符串、数字 对象&#xff1a;使用{}括起来的表示一个对象数组&#xff1a;使用[…...

JavaScript中decodeURIComponent函数的深入解析与应用指南

在Web开发中&#xff0c;经常需要对URI&#xff08;统一资源标识符&#xff09;进行编码和解码&#xff0c;以保证数据传输的准确性和可靠性。decodeURIComponent函数是JavaScript中用于解码由encodeURIComponent函数或其他类似方法编码的部分统一资源标识符&#xff08;URI&am…...

DMA方式为什么无需保护现场

DMA&#xff08;Direct Memory Access&#xff09;方式无需保护现场的原因主要与其工作原理和硬件设计有关。以下是对这一问题的详细解释&#xff1a; DMA工作原理 DMA是一种通过硬件直接在内存和外设之间传输数据的技术&#xff0c;无需CPU的介入。在DMA传输过程中&#xff…...

区块链可投会议CCF C--FC 2025 截止10.8 附录用率

Conference&#xff1a;Financial Cryptography and Data Security (FC) CCF level&#xff1a;CCF C Categories&#xff1a;network and information security Year&#xff1a;2025 Conference time&#xff1a;14–18 April 2025, Miyakojima, Japan 录用率&#xff1…...

springboot系列--web相关知识探索四

一、前言 web相关知识探索三中研究了请求中所带的参数是如何映射到接口参数中的&#xff0c;也即请求参数如何与接口参数绑定。主要有四种、分别是注解方式、Servlet API方式、复杂参数、以及自定义对象参数。web相关知识探索三中主要研究了注解方式以及Servlet API方式。本次…...

在PyQt5中,清空一个QFrame中的所有控件

在PyQt5中&#xff0c;如果你想要清空一个QFrame中的所有控件&#xff0c;你需要遍历该QFrame的布局&#xff08;假设你已经在其中添加了一个布局&#xff0c;比如QVBoxLayout或QHBoxLayout&#xff09;&#xff0c;并从布局中移除所有的控件。由于直接从布局中移除控件并不会立…...

SpringBoot实现:校园资料分享平台开发指南

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…...

Redis篇(缓存机制 - 基本介绍)(持续更新迭代)

目录 一、缓存介绍 二、经典三缓存问题 1. 缓存穿透 1.1. 简介 1.2. 解决方案 1.3. 总结 2. 缓存雪崩 2.1. 简介 2.2. 解决方案 2.3. 总结 3. 缓存击穿 3.1. 简介 3.2. 解决方案 3.3. 总结 4. 经典三缓存问题出现的根本原因 三、常见双缓存方案 1. 缓存预热 1…...

引领5G驱动的全球数字营销革新:章鱼移动广告全球平台的崛起

引领5G驱动的全球数字营销革新&#xff1a;章鱼移动广告全球平台的崛起 作为章鱼移动广告平台的营销战略顾问&#xff0c;黄珍珍通过她在市场营销、品牌推广、技术整合等多方面的丰富经验&#xff0c;成功推动了这一平台在全球广告市场的崛起。她不仅为平台的国际化扩展奠定了基…...

思维链ChatGPT

建立客户端 from openai import OpenAI client OpenAI(base_url"https://api.chatanywhere.tech/v1" )示例1 response client.chat.completions.create(model"gpt-3.5-turbo",messages[{"role": "user","content": &quo…...

idea中的Java版本运行错误

1.java: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field com.sun.tools.javac.tree.JCTree qualid 这个错误通常是由于升级到Java 21后,Lombok等库无法正确访问内部的Java编译器API导致的。具体原因如下: Lombok在…...

用HTML5+CSS+JavaScript庆祝国庆

用HTML5CSSJavaScript庆祝国庆 中华人民共和国的国庆日是每年的10月1日。 1949年10月1日&#xff0c;中华人民共和国中央人民政府成立&#xff0c;在首都北京天安门广场举行了开国大典&#xff0c;中央人民政府主席毛泽东庄严宣告中华人民共和国成立&#xff0c;并亲手升起了…...

《OpenCV 计算机视觉》—— 视频背景建模

文章目录 一、背景建模的目的二、背景建模的方法三、背景建模的步骤四、注意事项五、代码实现 一、背景建模的目的 视频背景建模的主要目的是从视频序列中提取出静态背景&#xff0c;以便将动态的前景对象与静态的背景进行分离。这有助于进一步分析和处理视频内容&#xff0c;…...

【Mac】和【安卓手机】 通过有线方式实现投屏

Mac 和 安卓手机 实现投屏&#xff08;有线&#xff09; 1.下载HomeBrew /bin/bash -c "$(curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/install/master/install.sh)"2.安装Scrcpy brew install scrcpy3.安装adb brew install android-platfor…...

GitHub flow工作流

github.com github.com使用自己版本的标记语法&#xff0c;它提供了一组额外的有用的 特性&#xff0c;其中许多特性使处理github.com上的内容更加容易。 用户名-提及 键入一个符号&#xff0c;后跟一个用户名&#xff0c;将通知此人前来查看评论。 这叫做“提及”&#x…...

【Qt笔记】QFrame控件详解

目录 引言 一、QFrame的基本特性 二、QFrame的常用方法 2.1 边框形状&#xff08;Frame Shape&#xff09; 2.2 阴影样式&#xff08;Frame Shadow&#xff09; 2.3 线条宽度&#xff08;Line Width&#xff09; 2.4 样式表(styleSheet) 三、QFrame的应用场景 四、应用…...

【二十八】【QT开发应用】模拟WPS Tab

WidgetBase 类旨在实现窗口的可调整大小功能&#xff0c;使用户能够手动改变窗口的尺寸。该类通过以下机制实现窗口缩放效果&#xff1a;当鼠标移动至窗口边缘时&#xff0c;鼠标指针样式会动态改变以指示可调整大小的方向。用户在边缘区域按下鼠标左键后&#xff0c;可以通过拖…...

PyQt入门指南四 事件处理机制详解

1. 事件处理概述 在PyQt中&#xff0c;事件处理是实现交互性的关键部分。事件可以是用户的操作&#xff08;如点击按钮、键盘输入&#xff09;&#xff0c;也可以是系统的通知&#xff08;如窗口最小化、定时器超时&#xff09;。PyQt使用信号&#xff08;Signals&#xff09;…...

【24最新亲试】ubuntu下载go最新版本

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了工具配置的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于Ubuntu 升级 golang 版本完美步骤进行的&#xff0c;每个知识点的修…...

InnoDB 事务模型

文章目录 InnoDB 事务模型事务ACID特性事务隔离级别 事务操作事务并发问题事务数据读写类型Consistent Nonlocking Reads 快照读Locking Reads 加锁读 MVCC 并发控制实现原理InnoDB 隐藏列Read ViewUndo log实现过程 MVCC与隔离级别MVCC和辅助索引 幻读可重复读MVCC会出现幻读的…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...

全面解析数据库:从基础概念到前沿应用​

在数字化时代&#xff0c;数据已成为企业和社会发展的核心资产&#xff0c;而数据库作为存储、管理和处理数据的关键工具&#xff0c;在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理&#xff0c;到社交网络的用户数据存储&#xff0c;再到金融行业的交易记录处理&a…...

热烈祝贺埃文科技正式加入可信数据空间发展联盟

2025年4月29日&#xff0c;在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上&#xff0c;可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞&#xff0c;强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...