【探索Linux】—— 强大的命令行工具 P.30(序列化和反序列化 | JSON序列化库 [ C++ ] )

在这里插入图片描述

阅读导航

  • 引言
  • 一、序列化反序列化概念
  • 二、各种语言序列化反序列化常用库
  • 三、C++的JSON序列化库
    • 1. RapidJSON库
      • (1)头文件
      • (2)相关函数
      • (3)参数
        • (4)特点
      • (5)使用示例
        • ⭕解析JSON字符串
        • ⭕生成JSON字符串:
    • 2. nlohmann/json库
      • (1)头文件
      • (2)相关函数
      • (3)参数
      • (4)特点
      • (5)使用示例
        • ⭕序列化为JSON
        • ⭕反序列化JSON字符串
    • 3. jsoncpp库
      • (1)头文件
      • (2)相关函数
      • (3)参数
      • (4)特点
      • (5)使用示例
        • ⭕解析JSON字符串
        • ⭕生成JSON字符串
  • 温馨提示

引言

当谈到网络编程时,序列化和反序列化是非常重要的概念。在上一篇文章中,我们已经了解了在Linux环境下实现简单的TCP网络程序的基础知识。本文将继续探讨序列化和反序列化,这些概念对于在网络上传输数据以及跨网络通信至关重要。通过深入了解序列化和反序列化,我们将能够更好地理解如何在网络编程中有效地处理数据。让我们一起深入探讨序列化和反序列化的重要性以及实际应用!

一、序列化反序列化概念

在计算机科学中,序列化(Serialization)和反序列化(Deserialization)是指将数据结构或对象转换为一种特定格式,以便在网络上传输或存储到磁盘中,然后在需要的时候将其重新恢复成原始的数据结构或对象的过程。

  • 序列化(Serialization):序列化是将数据结构或对象转换为一个线性的字节流或文本表示的过程。序列化后的数据可以被传输到网络上的其他计算机、存储到磁盘上或者在内存中保存。序列化通常用于数据持久化或网络通信,以便在不同系统之间交换数据。

  • 反序列化(Deserialization):反序列化是对序列化后的数据进行解析和重建原始数据结构或对象的过程。通过反序列化,可以从序列化的数据中还原出原始的对象或数据结构,使其可以在程序中继续使用或处理。

序列化和反序列化是实现数据持久化、跨网络通信、跨平台数据交换等功能的重要技术手段。常见的序列化格式包括 JSON、XML、Protocol Buffers 等,不同的序列化方式适用于不同的场景和需求。

二、各种语言序列化反序列化常用库

在很多编程语言和框架中,都提供了现成的函数或库来实现数据的序列化和反序列化操作,以简化开发者的工作。以下是一些常见的编程语言和对应的序列化库:

  1. Python

    • JSON:Python 的标准库中提供了 json 模块,可以用于将 Python 对象序列化为 JSON 格式或将 JSON 字符串反序列化为 Python 对象。
    • Pickle:Python 的标准库中也提供了 pickle 模块,可以用于将 Python 对象序列化为字节流或文件,实现更高级的数据序列化功能。
  2. Java

    • Jackson:Jackson 是一个流行的 Java 序列化库,可以实现 Java 对象和 JSON 数据之间的转换。
    • Gson:Gson 是另一个常用的 Java 序列化库,可以帮助将 Java 对象序列化为 JSON 格式或反序列化 JSON 数据为 Java 对象。
  3. C#

    • Json.NET:Json.NET(Newtonsoft.Json)是 C# 中广泛使用的 JSON 序列化库,可用于将对象序列化为 JSON 或反序列化 JSON 为对象。
    • Protobuf-net:Protobuf-net 是 C# 版本的 Protocol Buffers 库,提供了 ProtoBuf 格式的序列化和反序列化功能。

三、C++的JSON序列化库

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于数据传输和配置文件。在C++开发中,有几个常见的JSON库可用:

  1. RapidJSON:一个高性能的C++ JSON解析/生成库,使用简单且功能强大。

  2. nlohmann/json:一个现代化的C++ JSON库,具有简洁的API和直观的语法。

  3. jsoncpp:一个开源的C++ JSON库,易于集成和使用。

这些库都提供了解析JSON字符串和生成JSON字符串的功能,可以方便地操作JSON数据。选择适合项目需求和个人喜好的库,可以更快速、高效地处理JSON数据。下面我们会详细介绍这三个库

1. RapidJSON库

(1)头文件

  • 解析和生成JSON数据的主要头文件为rapidjson/document.hrapidjson/writer.hrapidjson/stringbuffer.h

(2)相关函数

  • 解析JSON字符串:Document::Parse(const Ch* str)
  • 生成JSON字符串:Writer::String(const Ch* str)

(3)参数

  • Document::Parse(const Ch* str):接受一个JSON字符串作为输入参数。
  • Writer::String(const Ch* str):接受一个字符串作为输入参数。
(4)特点
  • 高性能:RapidJSON具有极快的解析和生成速度,适合处理大规模JSON数据。
  • 低内存占用:内存效率高,可以在资源受限的环境中使用。
  • 支持标准:符合JSON标准,支持JSON文档的解析和生成。

(5)使用示例

⭕解析JSON字符串
     #include <rapidjson/document.h>using namespace rapidjson;const char* json = "{\"name\":\"John\", \"age\":30}";Document document;document.Parse(json);// 访问解析后的值const Value& name = document["name"];const Value& age = document["age"];assert(name.IsString());assert(age.IsInt());// 获取值std::string nameValue = name.GetString();int ageValue = age.GetInt();
⭕生成JSON字符串:
     #include <rapidjson/document.h>#include <rapidjson/writer.h>#include <rapidjson/stringbuffer.h>using namespace rapidjson;StringBuffer buffer;Writer<StringBuffer> writer(buffer);// 开始生成对象writer.StartObject();// 添加键值对writer.Key("name");writer.String("John");writer.Key("age");writer.Int(30);// 结束生成对象writer.EndObject();// 获取生成的JSON字符串std::string json = buffer.GetString();

2. nlohmann/json库

(1)头文件

  • nlohmann/json库的头文件为#include <nlohmann/json.hpp>

(2)相关函数

  • 序列化为JSON:json::dump()
  • 反序列化JSON字符串:json::parse()

(3)参数

  • json::dump(): 无需额外参数,将JSON对象序列化为JSON字符串。
  • json::parse(): 接受一个JSON字符串作为输入参数,将其解析为JSON对象。

(4)特点

  • 简洁易用:nlohmann/json提供简洁的API和直观的语法,使JSON操作变得简单。
  • 高级功能:支持自定义序列化和反序列化,以及方便的JSON查询和操作方法。
  • 跨平台性:支持多种操作系统和编译器,具有良好的跨平台性能。

(5)使用示例

⭕序列化为JSON
     #include <nlohmann/json.hpp>using json = nlohmann::json;// 创建一个JSON对象json jsonObj;jsonObj["name"] = "John";jsonObj["age"] = 30;// 序列化为JSON字符串std::string jsonString = jsonObj.dump();
⭕反序列化JSON字符串
     #include <nlohmann/json.hpp>using json = nlohmann::json;std::string jsonString = "{\"name\":\"John\", \"age\":30}";// 反序列化为JSON对象json jsonObj = json::parse(jsonString);// 访问值std::string name = jsonObj["name"].get<std::string>();int age = jsonObj["age"].get<int>();

3. jsoncpp库

(1)头文件

  • jsoncpp库的主要头文件为#include <json/json.h>

(2)相关函数

  • 解析JSON字符串:Reader::parse(const std::string &json, Value &root)
  • 生成JSON字符串:StyledWriter::write(const Value &root)

(3)参数

  • Reader::parse(const std::string &json, Value &root): 接受一个JSON字符串和一个Json::Value对象作为输入参数。
  • StyledWriter::write(const Value &root): 接受一个Json::Value对象作为输入参数。

(4)特点

  • 开源:jsoncpp是开源项目,可以自由获取并在各种项目中使用。
  • 容易集成:易于集成到现有项目中,并与标准C++容器进行交互。
  • 跨平台支持:具有良好的跨平台性能,可在不同平台上使用。

(5)使用示例

⭕解析JSON字符串
     #include <json/json.h>const char* json = "{\"name\":\"John\", \"age\":30}";Json::Value root;Json::Reader reader;bool parsingSuccessful = reader.parse(json, root);if (parsingSuccessful) {std::string name = root["name"].asString();int age = root["age"].asInt();}
⭕生成JSON字符串
     #include <json/json.h>Json::Value root;root["name"] = "John";root["age"] = 30;Json::StyledWriter writer;std::string jsonString = writer.write(root);

根据项目需求和个人偏好,选择适合的JSON库可以提高开发效率和代码质量。例如,如果需要处理大量JSON数据且要求高性能,可以选择RapidJSON;如果更注重简洁的API和易用性,可以考虑使用nlohmann/json;而如果希望能够轻松地与标准C++容器交互,jsoncpp可能是一个不错的选择。希望这些信息能够帮助您更好地了解每个JSON库的优势和特点

温馨提示

感谢您对博主文章的关注与支持!如果您喜欢这篇文章,可以点赞、评论和分享给您的同学,这将对我提供巨大的鼓励和支持。另外,我计划在未来的更新中持续探讨与本文相关的内容。我会为您带来更多关于Linux以及C++编程技术问题的深入解析、应用案例和趣味玩法等。如果感兴趣的话可以关注博主的更新,不要错过任何精彩内容!

再次感谢您的支持和关注。我们期待与您建立更紧密的互动,共同探索Linux、C++、算法和编程的奥秘。祝您生活愉快,排便顺畅!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/287665.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【最新】Claude Pro订阅充值,超大杯模型Claude 3 Opus模型体验方法

一、关于Claude Pro | Claude 3 Opus Claude 3 系列包含三个大模型&#xff0c;按能力由弱到强别是&#xff1a; Claude 3 Haiku (最小 / 速度最快)Claude 3 Sonnet (标准 / 免费使用)Claude 3 Opus (最强 / 需要付费订阅) 其中&#xff0c;最强的 Opus 在多项基准测试中得分…

gin语言基础学习--会话控制(下)

练习 模拟实现权限验证中间件 有2个路由&#xff0c;/cookie和/home/cookie用于设置cookiehome是访问查看信息的请求在请求home之前&#xff0c;先跑中间件代码&#xff0c;检验是否存在cookie 访问home&#xff0c;会显示错误&#xff0c;因为权限校验未通过 package mainim…

Laravel扩展包的开发

扩展包的开发 1. 创建一个新项目&#xff0c;初始化扩展包配置 首先创建一个全新的Laravel项目&#xff1a; composer create-project --prefer-dist laravel/laravel laravelPkg 接下来&#xff0c;在项目中创建目录package/{your_name}/{your_package_name} mkdir -p pa…

【源码】I.MX6ULL移植OpenCV

编译完成的源码&#xff1a; git clone https://gitee.com/wangyoujie11/atkboard_-linux_-driver.git 1.下载源码放在自己的opecv源码目录下 2.QTOpenCV工程代码放置的位置 3.更改.pro工程文件的opencv地址 4.使用命令行编译 前提是自己环境中已经配置好arm-qt的交叉编译…

C语言_第一轮笔记_指针

8.1 密码开锁 地址和指针 一般以变量所在的内存单元的第一个字节的地址作为他的地址NULL的值为0&#xff0c;代表空指针 指针变量的定义 类型名 *指针变量名类型名指定指针变量所指向变量的类型指针声明符*在定义指针变量时被使用&#xff0c;说明被定义的那个变量是指针指针变…

unity学习(68)——相机/模型的旋转/位置计算

这个比想象中要难&#xff0c;而且需要自己写。 1.相机可以转xy两个位置&#xff0c;可以点头和转圈。注意这里有一个if判断&#xff08;后面返回来发现了这些问题&#xff09; 2.角色不能点头&#xff0c;只能转圈。 难得是移动方向&#xff0c;因为移动方向(位置)和转向是相…

爬虫实践(1)

这一篇只提登录模拟&#xff0c;主要介绍chrome开发者窗口的使用&#xff0c;实际上相关接口调用都是用到cookie&#xff0c;需要再加一篇从token到cookie&#xff0c;以保证实践的完整性 以migu登录为例&#xff0c;分析其登录过程&#xff0c;之后可以使用任意语言模拟登录&…

蓝桥杯刷题(十四)

1.小平方 代码 n int(input()) count0 def f(x)->bool: # 判断条件return True if x**2%n<n/2 else False for i in range(1,n): # 遍历[1,n-1]&#xff0c;符合题意计数加一if f(i):count1 print(count)2.3的倍数 代码 a int(input()) b int(input()) c int(input…

springboot基本使用七(静态资源映射)

第一种方式通过配置文件设置&#xff1a; 实现方式&#xff1a;springboot基本使用二&#xff08;resources目录简单介绍&#xff09;-CSDN博客文章浏览阅读907次&#xff0c;点赞25次&#xff0c;收藏22次。再次访问&#xff1a;location:8099/index.html。两个静态资源目录中…

【No.20】蓝桥杯简单数论下|寻找整数|素数的判断|笨小猴|最大最小公倍数|素数筛|埃氏筛|欧氏线性筛|质数|分解质因子(C++)

寻找整数 【题目描述】 有一个不超过 1 0 1 7 10^17 1017的正整数n&#xff0c;知道这个数除以2至49后的余数如下表所示&#xff0c;求这个正整数最小是多少 解法一&#xff1a;模拟 暴力法&#xff1a;一个个检验 1 … 1 0 17 1\dots 10^{17} 1…1017的每个数 由于这个数n…

深度学习pytorch——减少过拟合的几种方法(持续更新)

1、增加数据集 2、正则化(Regularization) 正则化&#xff1a;得到一个更加简单的模型的方法。 以一个多项式为例&#xff1a; 随着最高次的增加&#xff0c;会得到一个更加复杂模型&#xff0c;模型越复杂就会更好的拟合输入数据的模型&#xff08;图-1&#xff09;&#…

2024品牌私域运营:「去中心化」正在成为企业决胜关键

越来越多的品牌选择以DTC模式与消费者互动和销售。通过与消费者建立紧密联系&#xff0c;不仅可提供更具成本效益的规模扩张方式&#xff0c;还能控制品牌体验、获取宝贵的第一方数据并提升盈利能力。许多企业采取的DTC私域策略以交易为中心的方法往往导致了成本上升和运营复杂…

Day18:LeedCode 513.找树左下角的值 112. 路径总和 106.从中序与后序遍历序列构造二叉树

513. 找树左下角的值 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1 思路:出该二叉树的 最底层 最左边 节点的值找出深度最大的第一个结点(左结点先遍历) 方法一…

发送请求- header配置

请求头里是客户端的要求&#xff0c;把你的诉求告诉服务端&#xff0c;服务端按照你的要求返回数据 &#xff0c; 请求header需要严格全配置&#xff0c;把请求header全部传入&#xff0c;不能频繁访问&#xff0c;让后端知道它是正常请求 一般只配置User-Agent和Content Typ…

模板方法模式(继承的优雅使用)

目录 前言 UML plantuml 类图 实战代码 AbstractRoutingDataSource DynamicDataSource DynamicDataSourceContextHolder 前言 在设计类时&#xff0c;一般优先考虑使用组合来替代继承&#xff0c;能够让程序更加的灵活&#xff0c;但这并不意味着要完全抛弃掉继承。 …

2024/3/26 C++作业

定义一个矩形类&#xff08;Rectangle&#xff09;&#xff0c;包含私有成员&#xff1a;长(length)、宽&#xff08;width&#xff09;, 定义成员函数&#xff1a; 设置长度&#xff1a;void set_l(int l) 设置宽度&#xff1a;void set_w(int w) 获取长度&#xff1a;int…

Python批量提取图像灰度共生矩阵(GLCM)、支持批量处理、任意图像格式

目录 一、介绍 二、实现 1、特征计算 2、批量处理 3、结果 一、介绍 灰度共生矩阵(Grey Level Co-occurrence Matrix)也叫做空间灰度级依赖矩阵(SGLDM),它是一种基于统计的纹理特征提取的方法。 一般包括四个方向&#xff1a; (a,b)(1,0)&#xff0c;像素对是水平的&am…

基于javaweb(springboot+mybatis)生活美食分享平台管理系统设计和实现以及文档报告

基于javaweb(springbootmybatis)生活美食分享平台管理系统设计和实现以及文档报告 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 …

在django中使用kindeditor出现转圈问题

在django中使用kindeditor出现转圈问题 【一】基础检查 【1】前端检查 确保修改了uploadJson的默认地址 该地址需要在路由层有映射关系 确认有加载官方文件 kindeditor-all-min.js确保有传递csrfmiddlewaretoken 或者后端关闭了csrf验证 <textarea name"content&qu…

AXI-Stream——草稿版

参考自哔站&#xff1a;FPGA IP之AXI4-Lite AXI4-Stream_哔哩哔哩_bilibili 信号 传输层级从小到大 包(----------transfer--transfer--------)------delay--------包(----------transfer--transfer--------) TKEEP和TSTRB共同决定了是哪种数据流