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

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&#xff08;使用 Serde 处理json&#xff09;什么是serde库设计使用 Serde 处理jsonr# 的使用 参考 Rust常用库之序列化和反序列化库serde&#xff08;使用 Serde 处理json&#xff09; 什么是serde库 官网&#xff1a;https:/…...

java设计模式(2)---六大原则

设计模式之六大原则 这篇博客非常有意义&#xff0c;希望自己能够理解的基础上&#xff0c;在实际开发中融入这些思想&#xff0c;运用里面的精髓。 先列出六大原则&#xff1a;单一职责原则、里氏替换原则、接口隔离原则、依赖倒置原则、迪米特原则、开闭原则。 一、单一职…...

数学建模(层次分析法 python代码 案例)

目录 介绍: 模板: 例题:从景色、花费、饮食,男女比例四个方面去选取目的地 准则重要性矩阵: 每个准则的方案矩阵:​ 一致性检验: 特征值法求权值: 完整代码: 运行结果: 介绍:...

Gitlab介绍

1.什么是Gitlab GitLab是一个流行的版本控制系统平台&#xff0c;主要用于代码托管、测试和部署。 GitLab是基于Git的一个开源项目&#xff0c;它提供了一个用于仓库管理的Web服务。GitLab使用Ruby on Rails构建&#xff0c;并提供了诸如wiki和issue跟踪等功能。它允许用户通…...

Amuse .NET application for stable diffusion

Amuse github地址&#xff1a;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】机器学习基本概念与建模流程的文章中我们已经知道了机器学习的一些基本概念和模型构建的流程&#xff0c;本章我们将介绍模型训练出来后如何对模型进行评估和选择等 1、 误差与过拟合 学习器对样本的实际预测结果与真实值之间的差异&#xff0c;我们称之…...

【11】工程化

一、为什么需要模块化 当前端工程到达一定规模后,就会出现下面的问题: 全局变量污染 依赖混乱 上面的问题,共同导致了代码文件难以细分 模块化就是为了解决上面两个问题出现的 模块化出现后,我们就可以把臃肿的代码细分到各个小文件中,便于后期维护管理 前端模块化标准…...

Python中requests、aiohttp、httpx性能对比

在Python中&#xff0c;有许多用于发送HTTP请求的库&#xff0c;其中最受欢迎的是requests、aiohttp和httpx。这三个库的性能和功能各不相同&#xff0c;因此在选择使用哪个库时&#xff0c;需要考虑到自己的需求和应用场景。 首先&#xff0c;让我们来了解一下这三个库的基本…...

网络原理(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协议如何管理地址&#xff1f; 1、动…...

GE IS200AEPAH1BKE IS215WEPAH2BB是两种不同的压力测量模块

GE IS200AEPAH1BKE和IS215WEPAH2BB是两种不同的压力测量模块&#xff0c;它们都属于GE&#xff08;通用电气&#xff09;公司的产品。 具体来说&#xff0c;以下是这两种模块的一些特点和应用&#xff1a; IS200AEPAH1BKE&#xff1a;这款模块适用于需要高性价比的压力测量应用…...

Rust 与 C++ ,孰优孰劣?

Rust 与 C 是两种高级系统级编程语言&#xff0c;它们都在追求性能、控制底层硬件细节的同时强调安全性。以下是两者的详细对比&#xff1a; 目标与理念 Rust&#xff1a;由 Mozilla 主导开发&#xff0c;目标是构建一种既快速又安全的系统级编程语言&#xff0c;特别是解决 C…...

MySQL、Oracle的时间类型字段自动更新:insert插入、update更新时,自动更新时间戳

1.MySQL 支持的字段类型&#xff1a;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框架集成新业务

总体框架设计见我另一篇博客&#xff1a;httpclienttestng接口自动化整体框架设计 <block&#xff1a;表示测试用例块> block后面是 测试用例的名称 ||接口名,该接口名在URL.txt里维护接口 ||get\post&#xff1a;表示请求的方法 get_1\2\3\4&#xff1a;代表加密 get: …...

springboot 单元测试

Spring Boot 单元测试是确保代码质量的重要部分&#xff0c;它允许我们在不实际启动整个应用的情况下测试我们的代码。在Spring Boot中&#xff0c;我们通常使用Spring Test模块和JUnit测试框架来编写单元测试。以下是一个简单的Spring Boot单元测试的详细代码介绍&#xff1a;…...

LeetCode---126双周赛

题目列表 3079. 求出加密整数的和 3080. 执行操作标记数组中的元素 3081. 替换字符串中的问号使分数最小 3082. 求出所有子序列的能量和 一、求出加密整数的和 按照题目要求&#xff0c;直接模拟即可&#xff0c;代码如下 class Solution { public:int sumOfEncryptedInt…...

[python] ETL 工作流程 Prefect

Prefect 是一个用于构建、调度和监控数据流程的 Python 库。它提供了一种简单而强大的方式来管理 ETL&#xff08;Extract, Transform, Load&#xff09;工作流程。下面是一个简单的示例&#xff0c;演示了如何使用 Prefect 来创建和运行一个简单的任务&#xff1a; 首先&…...

html第一次作业

常用标签 0, 骨架&#xff08;&#xff01;tap&#xff09; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><t…...

基于java实现的KTV点歌系统

开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclip…...

GPT+向量数据库+Function calling=垂直领域小助手

引言 将 GPT、向量数据库和 Function calling 结合起来&#xff0c;可以构建一个垂直领域小助手。例如&#xff0c;我们可以使用 GPT 来处理自然语言任务&#xff0c;使用向量数据库来存储和管理领域相关的数据&#xff0c;使用 Function calling 来实现领域相关的推理和计算规…...

DeepSeek-coder 微调训练记录

简介 微调过程不再细说, 参考link进行即可. 主要是数据集. 1.3b模型微调训练占用资源信息 top信息 评估 根据DeepSeek-coder的Evaluation试进行对微调后的模型进行评估. 其中的评估库主要是evol-teacher和human-eval. 新建一个eval_ins.sh文件, 填入以下内容 LANG"…...

Claude Code API配置实战:国内可用方案与模型选型指南

Claude Code 支持多种 API 接入方式&#xff0c;从个人订阅直连、API Key 调用&#xff0c;到企业级 Amazon Bedrock、Google Vertex AI、Microsoft Foundry&#xff0c;以及通过 LiteLLM 等 LLM Gateway 接入任意兼容提供商。本文梳理各方案的配置步骤、适用场景和选型建议&am…...

紧急!GraalVM上线后OOM频发?立即执行这5个内存安全检查项——覆盖Quarkus/Spring Native主流框架

第一章&#xff1a;GraalVM静态镜像内存异常的典型表征与根因定位全景图GraalVM 静态镜像&#xff08;Native Image&#xff09;在启动性能与资源占用方面具备显著优势&#xff0c;但其编译期内存模型与运行时行为存在根本性差异&#xff0c;导致内存异常表现隐晦且难以复现。典…...

Java面试题知识图谱构建:利用PyTorch 2.8图神经网络(GNN)技术

Java面试题知识图谱构建&#xff1a;利用PyTorch 2.8图神经网络&#xff08;GNN&#xff09;技术 1. 引言&#xff1a;Java面试题的痛点与解决方案 对于准备Java面试的开发者来说&#xff0c;最大的挑战不是找不到学习资料&#xff0c;而是面对海量分散的知识点无从下手。JVM…...

如何使用R语言制作词云

词云是一种常见的文本数据可视化的方法&#xff0c;词云分析的工作有多种&#xff0c;其中使用R语言中的wordcloud包中的wordcloud2函数可以很方便地制作词云。 关于wordcold2函数的用法不再赘述&#xff0c;查以使用help(wordcloud2)查看有关帮助&#xff0c;其中的参数是不难…...

BetterGenshinImpact多开功能终极指南:同时管理多个原神账号的完整方案

BetterGenshinImpact多开功能终极指南&#xff1a;同时管理多个原神账号的完整方案 【免费下载链接】better-genshin-impact &#x1f4e6;BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动刷本 | 自动采集/挖矿/锄地 | 一条龙…...

JMS, ActiveMQ 学习一则唾

开发个什么Skill呢&#xff1f; 通过 Skill&#xff0c;我们可以将某些能力进行模块化封装&#xff0c;从而实现特定的工作流编排、专家领域知识沉淀以及各类工具的集成。 这里我打算来一次“套娃式”的实践&#xff1a;创建一个用于自动生成 Skill 的 Skill&#xff0c;一是用…...

【PHP异步I/O配置终极指南】:20年SRE亲授EventLoop选型、Swoole协程适配与ReactPHP性能调优(附压测对比数据)

第一章&#xff1a;PHP异步I/O配置全景认知与演进脉络PHP的异步I/O能力并非原生内置&#xff0c;而是伴随SAPI模型演进、扩展生态成熟及现代协程范式兴起逐步构建的。从早期通过多进程&#xff08;pcntl_fork&#xff09;或轮询&#xff08;stream_select&#xff09;模拟非阻塞…...

智能字幕处理引擎:基于LLM的视频字幕全流程自动化解决方案

智能字幕处理引擎&#xff1a;基于LLM的视频字幕全流程自动化解决方案 【免费下载链接】VideoCaptioner &#x1f3ac; 卡卡字幕助手 | VideoCaptioner - 基于 LLM 的智能字幕助手 - 视频字幕生成、断句、校正、字幕翻译全流程处理&#xff01;- A powered tool for easy and e…...

【算法实战 | DFS应用】从迷宫到图论:深度优先搜索的进阶技巧与优化策略

1. 深度优先搜索的核心思想 深度优先搜索&#xff08;DFS&#xff09;就像一个人在迷宫里探险&#xff0c;遇到岔路时总是选择最左边的那条路&#xff0c;走到死胡同再原路返回&#xff0c;尝试下一条未走过的路。这种"不撞南墙不回头"的特性&#xff0c;正是DFS最形…...

RAG是什么?为什么它能让AI更靠谱,告别“一本正经地胡说八道”

RAG可以理解为“先查资料&#xff0c;再回答”&#xff1a;让AI更像带依据的助手&#xff0c;而不是自由发挥的写作机。 你会拿到&#xff1a;RAG人话解释 引用式输出模板&#xff08;可复制&#xff09;。 本文由“壹伴编辑器”提供技术支持 1&#xff5c;一句话讲清 你可能遇…...