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
相关文章:
Rust常用库之序列化和反序列化库serde(使用 Serde 处理json)
文章目录 Rust常用库之序列化和反序列化库serde(使用 Serde 处理json)什么是serde库设计使用 Serde 处理jsonr# 的使用 参考 Rust常用库之序列化和反序列化库serde(使用 Serde 处理json) 什么是serde库 官网:https:/…...
java设计模式(2)---六大原则
设计模式之六大原则 这篇博客非常有意义,希望自己能够理解的基础上,在实际开发中融入这些思想,运用里面的精髓。 先列出六大原则:单一职责原则、里氏替换原则、接口隔离原则、依赖倒置原则、迪米特原则、开闭原则。 一、单一职…...
数学建模(层次分析法 python代码 案例)
目录 介绍: 模板: 例题:从景色、花费、饮食,男女比例四个方面去选取目的地 准则重要性矩阵: 每个准则的方案矩阵: 一致性检验: 特征值法求权值: 完整代码: 运行结果: 介绍:...
Gitlab介绍
1.什么是Gitlab GitLab是一个流行的版本控制系统平台,主要用于代码托管、测试和部署。 GitLab是基于Git的一个开源项目,它提供了一个用于仓库管理的Web服务。GitLab使用Ruby on Rails构建,并提供了诸如wiki和issue跟踪等功能。它允许用户通…...
Amuse .NET application for stable diffusion
Amuse github地址:https://github.com/tianleiwu/Amuse .NET application for stable diffusion, Leveraging OnnxStack, Amuse seamlessly integrates many StableDiffusion capabilities all within the .NET eco-system Welcome to Amuse! Amuse is a profes…...
【机器学习-05】模型的评估与选择
在前面【机器学习-01】机器学习基本概念与建模流程的文章中我们已经知道了机器学习的一些基本概念和模型构建的流程,本章我们将介绍模型训练出来后如何对模型进行评估和选择等 1、 误差与过拟合 学习器对样本的实际预测结果与真实值之间的差异,我们称之…...
【11】工程化
一、为什么需要模块化 当前端工程到达一定规模后,就会出现下面的问题: 全局变量污染 依赖混乱 上面的问题,共同导致了代码文件难以细分 模块化就是为了解决上面两个问题出现的 模块化出现后,我们就可以把臃肿的代码细分到各个小文件中,便于后期维护管理 前端模块化标准…...
Python中requests、aiohttp、httpx性能对比
在Python中,有许多用于发送HTTP请求的库,其中最受欢迎的是requests、aiohttp和httpx。这三个库的性能和功能各不相同,因此在选择使用哪个库时,需要考虑到自己的需求和应用场景。 首先,让我们来了解一下这三个库的基本…...
网络原理(5)——IP协议(网络层)
目录 一、IP协议报头介绍 1、4位版本 2、4位首部长度 3、8位服务器类型 4、16位总长度 5、16位标识位 6、3位标志位 7、13位偏移量 8、8位生存空间 9、8位协议 10、16位首部检验和 11、32位源IP地址 12、32位目的IP地址 二、IP协议如何管理地址? 1、动…...
GE IS200AEPAH1BKE IS215WEPAH2BB是两种不同的压力测量模块
GE IS200AEPAH1BKE和IS215WEPAH2BB是两种不同的压力测量模块,它们都属于GE(通用电气)公司的产品。 具体来说,以下是这两种模块的一些特点和应用: IS200AEPAH1BKE:这款模块适用于需要高性价比的压力测量应用…...
Rust 与 C++ ,孰优孰劣?
Rust 与 C 是两种高级系统级编程语言,它们都在追求性能、控制底层硬件细节的同时强调安全性。以下是两者的详细对比: 目标与理念 Rust:由 Mozilla 主导开发,目标是构建一种既快速又安全的系统级编程语言,特别是解决 C…...
MySQL、Oracle的时间类型字段自动更新:insert插入、update更新时,自动更新时间戳
1.MySQL 支持的字段类型:DATETIME、TIMESTAMP drop table if exists test_time_auto_update; create table test_time_auto_update (id bigint auto_increment primary key comment 自增id,name varchar(8) …...
Testng框架集成新业务
总体框架设计见我另一篇博客:httpclienttestng接口自动化整体框架设计 <block:表示测试用例块> block后面是 测试用例的名称 ||接口名,该接口名在URL.txt里维护接口 ||get\post:表示请求的方法 get_1\2\3\4:代表加密 get: …...
springboot 单元测试
Spring Boot 单元测试是确保代码质量的重要部分,它允许我们在不实际启动整个应用的情况下测试我们的代码。在Spring Boot中,我们通常使用Spring Test模块和JUnit测试框架来编写单元测试。以下是一个简单的Spring Boot单元测试的详细代码介绍:…...
LeetCode---126双周赛
题目列表 3079. 求出加密整数的和 3080. 执行操作标记数组中的元素 3081. 替换字符串中的问号使分数最小 3082. 求出所有子序列的能量和 一、求出加密整数的和 按照题目要求,直接模拟即可,代码如下 class Solution { public:int sumOfEncryptedInt…...
[python] ETL 工作流程 Prefect
Prefect 是一个用于构建、调度和监控数据流程的 Python 库。它提供了一种简单而强大的方式来管理 ETL(Extract, Transform, Load)工作流程。下面是一个简单的示例,演示了如何使用 Prefect 来创建和运行一个简单的任务: 首先&…...
html第一次作业
常用标签 0, 骨架(!tap) <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><t…...
基于java实现的KTV点歌系统
开发语言:Java 框架:ssm 技术:JSP JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclip…...
GPT+向量数据库+Function calling=垂直领域小助手
引言 将 GPT、向量数据库和 Function calling 结合起来,可以构建一个垂直领域小助手。例如,我们可以使用 GPT 来处理自然语言任务,使用向量数据库来存储和管理领域相关的数据,使用 Function calling 来实现领域相关的推理和计算规…...
DeepSeek-coder 微调训练记录
简介 微调过程不再细说, 参考link进行即可. 主要是数据集. 1.3b模型微调训练占用资源信息 top信息 评估 根据DeepSeek-coder的Evaluation试进行对微调后的模型进行评估. 其中的评估库主要是evol-teacher和human-eval. 新建一个eval_ins.sh文件, 填入以下内容 LANG"…...
从Office功能区的“局外人“到“掌控者“:Office RibbonX Editor深度指南
从Office功能区的"局外人"到"掌控者":Office RibbonX Editor深度指南 【免费下载链接】office-ribbonx-editor An overhauled fork of the original Custom UI Editor for Microsoft Office, built with WPF 项目地址: https://gitcode.com/g…...
3分钟掌握HashCalculator:你的文件完整性守护专家
3分钟掌握HashCalculator:你的文件完整性守护专家 【免费下载链接】HashCalculator 哈希值计算工具,批量计算/批量校验/查找重复文件/改变哈希值等,支持集成到系统右键菜单 项目地址: https://gitcode.com/gh_mirrors/ha/HashCalculator …...
榨干Codex!OpenAI工程师亲授Codex真正用法
你可能把 Codex 当编程助手用,改改代码,跑跑测试。但它的能力远不止于此。OpenAI 的客户支持工程师 Jason(jxnlco)告诉你,Codex 其实是一套完整的电脑工作系统,从语音输入到自动化,从浏览器操控…...
php有什么版本,php语言有几个版本
php有什么版本,php语言有几个版本PHP的大版本主要分四支:PHP4/PHP5/PHP6/PHP7 其中,PHP4由于太古老、对OO支持不力已基本被淘汰,请无视PHP4。 PHP6由于基本没有生产线上的应用,还基本只是一款概念产品,很多功能已在PHP…...
render_async嵌套渲染:构建复杂异步界面的完整解决方案
render_async嵌套渲染:构建复杂异步界面的完整解决方案 【免费下载链接】render_async render_async lets you include pages asynchronously with AJAX 项目地址: https://gitcode.com/gh_mirrors/re/render_async 在现代Web开发中,页面加载速度…...
Facebook登录协议逆向解析:appsecret_proof与e2e加密机制
1. 这不是“爬虫教程”,而是一次对现代Web身份协议的解剖实验你有没有试过,在调试一个Facebook登录集成时,浏览器Network面板里突然冒出一串带sig、access_token、e2e、c_user的请求,参数长度动辄上千字符,加密方式五花…...
告别繁琐审核!实测AI Agent如何重塑复杂非结构化票据与合同处理流程?
摘要:在企业数字化转型步入深水区的2026年,处理复杂非结构化票据与合同已成为横亘在财务、法务部门面前的“最后一公里”难题。传统RPA因UI变动易崩溃、主流智能体因缺乏API适配而无法落地,导致大量业务仍依赖低效的人工操作。本文由「企服AI…...
学习课程学习报告
本周主要学习了深度学习的基础理论,包括深度学习的数学本质、激活函数、前向传播与反向传播的原理。重点理解了非线性激活函数对模型表达能力的作用,掌握了前向传播的矩阵表示,并推导了反向传播的梯度计算过程,为后续神经网络训练…...
保姆级教程:手把手教你用插桩法逆向分析小红书X-S加密(附完整JSVMP日志)
JSVMP逆向工程实战:从加密定位到算法还原的全流程解析 逆向工程的世界里,JSVMP(JavaScript Virtual Machine Protection)一直是让许多开发者望而生畏的存在。这种前端代码虚拟化保护技术通过将JavaScript源代码编译为自定义字节码…...
机器学习赋能组合优化:全局退火算法在三维伊辛模型上的实战超越
1. 项目概述:当机器学习遇上组合优化,一场算法效率的革命在计算机科学和运筹学的核心地带,组合优化问题无处不在。从决定物流公司如何安排数千辆卡车的路线,到芯片设计时如何摆放数十亿个晶体管以实现最佳性能,再到为复…...
