Rust常用库之序列化和反序列化库serde(使用 Serde 处理json)

文章目录

  • Rust常用库之序列化和反序列化库serde(使用 Serde 处理json)
    • 什么是serde库
    • 设计
    • 使用 Serde 处理json
      • r# 的使用
    • 参考

Rust常用库之序列化和反序列化库serde(使用 Serde 处理json)

什么是serde库

官网:https://serde.rs/

serde(Serialization/Deserialization)是一个用于在 Rust 中进行序列化和反序列化的强大库。它允许您在不同的数据表示之间进行转换,如 JSON、Bincode、CBOR、MessagePack 等。

**Rust中的serde crate用于高效地序列化和反序列化多种格式的数据。**它通过提供两个可以使用的traits来实现这一点,这两个traits为 Deserialize 和 Serialize 。作为生态系统中最著名的 crate 之一,它目前支持 20 多种类型的序列化(反序列化)。

serde 库提供了一个注解 #[derive(Serialize, Deserialize)],通过在结构体或枚举上添加该注解,可以自动为其生成序列化和反序列化的代码。这使得在 Rust 中进行序列化和反序列化变得非常简单和方便。

设计

许多其他语言依赖运行时反射来序列化数据,而 Serde 是建立在 Rust 强大的特征系统之上的。知道如何序列化和反序列化本身的数据结构是实现 Serde Serialize和DeserializeTraits (或使用 Serde 的导出属性在编译时自动生成实现)的数据结构。这避免了反射或运行时类型信息的任何开销。事实上,在许多情况下,Rust 编译器可以完全优化数据结构和数据格式之间的交互,使 Serde 序列化在数据结构和数据格式的特定选择上执行与手写序列化器相同的速度。

使用 Serde 处理json

通过使用 serde,您可以轻松地将结构体、枚举、向量、哈希表等 Rust 数据类型转换为各种格式的数据(如 JSON 字符串),以及将这些格式的数据转换回原始的 Rust 数据类型。

Serde 开箱即用,能够满足序列化和反序列化常见 Rust 数据类型。例如String,&str、usize、 Vec、HashMap<K,V>都支持。此外,Serde 还提供了派生宏来为您自己的程序中的结构生成序列化实现。使用派生宏的方式如下:

use serde::{Serialize, Deserialize};#[derive(Serialize, Deserialize, Debug)]
struct Point {x: i32,y: i32,
}fn main() {let point = Point { x: 1, y: 2 };// Convert the Point to a JSON string.let serialized = serde_json::to_string(&point).unwrap();// Prints serialized = {"x":1,"y":2}println!("serialized = {}", serialized);// Convert the JSON string back to a Point.let deserialized: Point = serde_json::from_str(&serialized).unwrap();// Prints deserialized = Point { x: 1, y: 2 }println!("deserialized = {:?}", deserialized);
}

r# 的使用

r# 是一种 Rust 字符串字面量的前缀标记,用于定义原始字符串(Raw Strings)。
r#" 是原始字符串的开始标记,表示接下来的字符串是一个原始字符串。原始字符串是一种在字符串中可以包含换行符和其他特殊字符的方式,而不需要使用转义字符来表示。

在原始字符串中,你可以自由地包含换行符、引号、斜杠等字符,而不需要转义它们。在这个例子中,data_str 定义了一个包含 JSON 格式数据的原始字符串,其中包含了换行符和双引号。

使用原始字符串可以使得字符串的书写更加直观和易读,尤其是当字符串中包含大量特殊字符或格式化的文本时。

let data_str = r#"{"name": "Jane Doe","age": "25","net_worth" : "$1000000"}"#
.to_string();
let key = "net_worth".to_string();

.to_string() 是将原始字符串转换为 String 类型的方法调用。

原始字符串(Raw Strings)是一种特殊的字符串字面量,它的类型是 &str,即字符串切片。然而,有时候我们可能需要将原始字符串转换为 String 类型,以便在程序中更方便地操作和处理它。

如果只需要对字符串进行读取或不需要修改的操作,原始字符串的 &str 类型可能已经足够使用。转换为 String 类型取决于具体的需求和后续的处理逻辑。

从json中获取某个字段的值:

let v: Value = serde_json::from_str(&data_str).unwrap();
let val = &v[key];

代码解释:

  • serde_json::from_str(&data_str) 是 serde_json 库提供的函数,用于将字符串 data_str 解析为 JSON 数据。from_str 函数将字符串解析为 * Value 类型的 JSON 数据,并返回一个 Result 类型的结果。
  • unwrap() 方法用于从 Result 类型中提取出解析后的 Value 值,如果解析成功则返回该值,否则触发 panic。
  • let val = &v[key]; 通过给定的键 key 从 Value 类型的 JSON 数据 v 中获取对应的值。

Value 类型是由 serde_json 库提供的。它是一个枚举类型,用于表示 JSON 数据的不同种类和结构。

serde_json 是 Rust 中的一个用于处理 JSON 数据的流行库。它提供了一组用于解析、序列化和处理 JSON 数据的函数和类型。其中,Value 枚举类型是 serde_json 的核心类型之一。

Value 枚举类型定义了不同种类的 JSON 值。它有以下变体(variants):

  • Null: 表示 JSON 的 null 值。
  • Bool: 表示 JSON 的布尔值。
  • Number: 表示 JSON 的数值。
  • String: 表示 JSON 的字符串。
  • Array: 表示 JSON 的数组。
  • Object: 表示 JSON 的对象。
    通过使用 Value 枚举类型,我们可以方便地处理和操作不同类型的 JSON 数据,而无需提前知道其确切的结构或类型

Value 类型是由 serde_json 库提供的。它是一个枚举类型,用于表示 JSON 数据的不同种类和结构。

这段代码使用 serde_json::Value 类型来表示通过 serde_json 解析的 JSON 数据,并通过 Value 的各种方法和功能来处理和操作它们。
serde_json 库将字符串 data_str 解析为 Value 类型的 JSON 数据,并从中获取特定键的值。

参考

【跟小嘉学 Rust 编程】二十六、Rust的序列化解决方案(Serde)
https://blog.csdn.net/fj_Author/article/details/132623766

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

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

相关文章

易源堂梵仕哲品牌新品发布会

祥龙启新&#xff0c;非凡无际&#xff01;2024年3月16日&#xff0c;上海易源堂集团梵仕哲品牌新品发布会在有着“山水宁海,寿者之乡”称号的浙江宁海顺利召开&#xff1b;易源堂集团联合创始人集团副总经理李振雨、易源堂集团营销策划总监曹斌&#xff0c;易源堂副总经理姚军…

缓存Caffine

缓存Caffine Caffine介绍添加手动加载自动加载异步加载 驱逐基于容量基于时间基于引用 移除显式移除移除监听器 刷新计算Interner规范 Caffine介绍 ​ Caffeine是一个基于Java8开发的提供了近乎最佳命中率的高性能的缓存库。 缓存和ConcurrentMap有点相似&#xff0c;但还是有…

mysql 用户管理-账户管理

学习了《mysql 用户管理-权限表》。接着学习更常用的的账户管理。 2&#xff0c;账户管理 MySQL提供许多语句用来管理用户账号,这些语句可以用来管理包括登录和退出MySQL服务器、创建用户、删除用户、密码管理和权限管理等内容。MySQL 数据库的安全性&#xff0c;需要通过账户管…

注册马来西亚商标常见问题

马来西亚商标法于1983年9月1日正式生效。这部商标法废除了马来亚、沙巴和沙捞越三地区各自的商标法规和申请程序&#xff0c;使马来西亚有了一部统一商标法。此外&#xff0c;马来西亚有关商标的法规包括1983年9月1日同时生效的《1983年商标法实施细则》。在马来西亚&#xff0…

Xcode-双架构arm64 x86_64编译

要启用通用构建&#xff0c;在最新版本的 Xcode 中&#xff0c;请打开您的项目设置&#xff0c;然后依次选择&#xff1a; 1. “Build Settings” 选项卡。 2. 在顶部输入框中输入 “Architectures”。 3. 在 “Architectures” 下拉列表中选择 “Other”。 4. 在输入框中输入 …

国内git最新版本下载链接2.44

git官网地址:Git - Downloading Package (git-scm.com) 蓝奏云: ​​​​​​gGit-2.44.0-64-bit.exe - 蓝奏云 git仓库地址:git/git: Git Source Code Mirror - This is a publish-only repository but pull requests can be turned into patches to the mailing list via …

有哪些方式适合保存token

保存token的最佳方式取决于具体的应用场景和需求。以下是几种常见的保存token的方式及其优缺点&#xff0c;以便您根据实际情况进行选择&#xff1a; HTTP Only Cookies&#xff1a; 优点&#xff1a;Cookies可以自动随HTTP请求发送&#xff0c;且HTTP Only属性可以防止JavaS…

2024常用接口抓包以及接口测试工具总结【建议收藏】

接口 统称为API&#xff0c;程序与程序之间的对接、交接。 接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点&#xff0c;主要是为了检验不同组件&#xff08;模块&#xff09;之间数据的传递是否正确&#xff0c;同时接口测试还要测试当前系统与第三方…

贪心算法的魅力与应用

在算法的世界里&#xff0c;贪心算法&#xff08;Greedy Algorithm&#xff09;以其简洁而高效的策略吸引着我们的目光。本文将深入探讨贪心算法的原理、特点以及它在实际问题中的广泛应用。 一、什么是贪心算法&#xff1f; 贪心算法是一种在每一步选择中都采取当前看起来最优…

zoom 在 css中的用法

zoom怎么用&#xff1f;&#xff08; 缩放和清除浮动&#xff09; 1、用css中的zoom属性可以让网页实现IE7中的放大缩小功能。 比如你想让你的网页缩小为原来的一半&#xff0c;那么就在body中加入style"zoom:0.5"&#xff0c; eg: zoom:120%, zoom:1 &#xff0…

谈谈我对 AIGC 趋势下软件工程重塑的理解

作者&#xff1a;陈鑫 今天给大家带来的话题是 AIGC 趋势下的软件工程重塑。今天这个话题主要分为以下四大部分。 第一部分是 AI 是否已经成为软件研发的必选项&#xff1b;第二部分是 AI 对于软件研发的挑战及智能化机会&#xff0c;第三部分是企业落地软件研发智能化的策略…

MySQL的事务深入理解和存储系统

目录 一、事务的基本理论 1.事务的隔离 1.1事务之间的相互影响 1.2事物隔离级别 2.查询和设置事物隔离级别 2.1查询全局事务隔离级别 2.2查询会话事物隔离级别 2.3设置全局事务隔离级别 2.4设置会话事务隔离级别 ​编辑3.事务控制语句 ​编辑3.1提交事务 ​编辑3.2…

服务器相关问题以及见解

1、服务器组成主要包含哪些主要部件&#xff1f; 中央处理器&#xff08;CPU&#xff09;&#xff1a;服务器的大脑&#xff0c;负责执行计算任务和处理数据。内存&#xff08;RAM&#xff09;&#xff1a;临时存储设备&#xff0c;用于存放正在使用或即将使用的数据&#xff…

Python问题异常处理与日志结合

我们掌握了try-except来处理程序运行中可能遇到的异常&#xff0c;以及使用logging来记录程序运行日志&#xff0c;该篇文章就结合二者来讲讲如何记录程序运行过程中的各种事件、状态信息以及遇到的异常情况&#xff0c;以便于追踪、诊断和解决程序运行时的问题。 目录 一、配…

H3C技术大全复现之高级路由交换技术 1

华子目录 VLAN 基本技术VLANIEEE 802.1Q交换机端口类型MVRP协议实验测试 VLAN扩展技术Super VLAN产生背景Super vlan&#xff08;相当于vlanif接口&#xff0c;也属于虚拟接口&#xff0c;可以充当网关&#xff09;Sub vlan&#xff08;普通vlan&#xff09;关于代理ARP普通代理…

【C语言】编译链接

1、宏&#xff08;***&#xff09; 1.1#define定义宏 #define 机制包括了一个规定&#xff0c;允许把参数替换到文本中&#xff0c;这种实现通常称为宏&#xff08;macro&#xff09;或定义 宏&#xff08;define macro&#xff09;。 注意&#xff1a;用于对数值表达式进行求…

flutter 单例模式

总的思想就是: 确保整个应用程序中只有一个 TranslationService 实例。 避免重复创建相同的实例,节省资源。 为整个应用程序提供一个全局访问点,方便在不同地方使用同一个实例。 1.类创建个实例 2.然后用构造函数赋值给实例 3.其他地方调用时返回实例 import package:social…

Java毕业设计-基于springboot开发的网上图书商城平台-毕业论文+答辩PPT(附源代码+演示视频)

文章目录 前言一、毕设成果演示&#xff08;源代码在文末&#xff09;二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构 三、系统实现展示1、系统功能模块2、管理员功能模块3、卖家功能模块 四、毕设内容和源代码获取总结 Java毕业设计-基于springboot开发的网上图书商城…

taro之Swiper的使用

图样&#xff1a; 往往我们需要轮播图去显示我们想要的图片之类的 这是工作的代码 <View classNametop-title><SwiperclassNamebanner-swiperinterval{3000}circularautoplay>{homeBannerList.map((item) > {return (<SwiperItem key{item.id}><View…

apisix创建https

总结了下apisix 使用https 的问题和方法 1、apisix 默认https 端口是9443 2、apisix 需要上传证书后才可以使用https 否二curl测试会报错 SSL routines:CONNECT_CR_SRVR_HELLO 3、apisix 上传证书方法 我是使用的自签名证书&#xff0c;注意自签名证书的Common Name 要写你…