精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

在Rust中使用Serde的詳細指南

開發 前端
如果你希望所有標簽都具有相同的名稱,例如Student,該怎么辦呢?你可能認為可以使用rename_all來實現這一點,但實際上并非如此,應該手動重命名枚舉中的每個變體。

在處理HTTP請求時,我們總是需要在一種數據結構(可以是enum、struct等)和一種可以存儲或傳輸并稍后重建的格式(例如JSON)之間來回轉換。

Serde是一個庫(crate),用于高效、通用地序列化和反序列化Rust數據結構。在本文中,將詳細介紹如何使用Serde對數據結構進行序列化和反序列化操作。

讓我們從一個簡單的結構體Student開始,它的定義如下所示,并進行初始化。

use serde::{Serialize, Deserialize};

#[derive(Debug, Clone, Serialize, Deserialize)]
struct Student {
    pub name: String, 
    pub student_id: String,
}

let student = Student{name:"tom".to_owned(), student_id:"J19990".to_owned()};

約定

對于上面的示例,如果我們使用serde_json::to_string(&student)將其轉換為JSON字符串,那么輸出將如下所示。

{
  "name": "tom",
  "student_id": "J19990"
}

看起來太棒了!然而,這依賴于發送HTTP請求的內容,很有可能會與Rust中的數據結構有不同的大小寫約定。

基本上有兩種方法可以進行約定:可以重命名字段;也可以對整個結構應用大小寫約定。

例如,我們實際上希望使用studentId而不是student_id作為字段名。

方法1:使用#[serde(rename="")重命名單個字段。

struct Student {
    pub name: String, 
    #[serde(rename="studentId")
    pub student_id: String,
}

方法2:使用#[serde(rename_all="camelCase")將大小寫約定駝峰形式,應用于整個結構體。

#[serde(rename_all = "camelCase")]
struct Student {
    pub name: String, 
    pub student_id: String,
}

任何一種方法都會給出以下輸出:

{
  "name": "tom",
  "studentId": "J19990"
}

除了camelCase之外,還可以應用其他的約定。取值為“lowercase, UPPERCASE, PascalCase, camelCase, snake_case, SCREAMING_SNAKE_CASE, kebab-case, SCREAMING-KEBAB-CASE”。

Skip

Skip可用于不希望序列化或反序列化的字段。下面是一個簡單的例子。讓我們給Student添加birth_year和age。

struct Student {
    pub name: String, 
    pub student_id: String,
    pub birth_year: u32,
    pub age: u32,
}

我們可能希望動態更新年齡,因此需要對學生birth_year的引用。但是,當我們發送請求時,應該只顯示age字段,這可以使用#[serde(skip)]來解決。

struct Student {
    pub name: String, 
    pub student_id: String,
    #[serde(skip)]
    pub birth_year: u32,
    pub age: u32,
}

通過這樣做,我們的JSON對象將變成:

{
  "name": "tom",
  "studentId": "J19990",
  "age": 123
}

Skip If

最常見的兩種使用方法是作用于Option字段和空的vector字段。

Option

假設我們有一個middle_name: Option<String>字段,如果我們想在學生沒有這個字段的情況下跳過這個字段,我們可以這樣做。

struct Student {
    pub name: String, 
    pub student_id: String,
    #[serde(skip_serializing_if="Option::is_none")]
    pub middle_name: Option<String>
}

這將為帶有或不帶有中間名的學生生成如下JSON:

// 沒有中間名
{
  "name": "tom",
  "studentId": "J19990",
}

// 有中間名
{
  "name": "tom",
  "studentId": "J19990",
  "middleName": "middle"
}

Vector

例如,我們為student結構體提供了pets: Vec<String>字段。由于學生不必擁有寵物,它可以是一個空向量。

要跳過對空向量的序列化,可以向字段添加以下屬性。

#[serde(skip_serializing_if="Vec::is_empty")]
pub pets: Vec<String>,

有屬性和沒有屬性之間的輸出差異如下所示。

// 沒有屬性
{
  "name": "tom",
  "studentId": "J19990",
  "pets": []
}

// 有屬性
{
  "name": "tom",
  "studentId": "J19990"
}

Flatten

讓我們創建一個名為SideInfo的新結構體,并將Student結構體更改為以下內容。

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
struct Student {
    pub name: String, 
    pub student_id: String,
    #[serde(skip_serializing_if="Option::is_none")]
    pub side_info: Option<SideInfo>
}

#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
struct SideInfo {
    #[serde(skip_serializing_if="Option::is_none")]
    pub pets: Option<Vec<String>>,
    #[serde(skip_serializing_if="Option::is_none")]
    pub address: Option<String>,
}

讓我們創建一個新的Student

let student = Student{name:"dan".to_owned(), student_id: "1".to_owned(), side_info:Some(SideInfo{address:Some("47 street".to_owned()), ..Default::default()})};

并輸出它的JSON字符串:

{
  "name": "dan",
  "studentId": "1",
  "sideInfo": {
    "address": "47 street"
  }
}

如你所見,地址字段嵌套在sideInfo中。我們可以通過將屬性flatten添加到Student結構體中的sideInfo字段上,來消除嵌套。

#[serde(skip_serializing_if="Option::is_none", flatten)]
pub side_info: Option<SideInfo>

就會變成:

{
  "name": "dan",
  "studentId": "1",
  "address": "47 street"
}

枚舉上的標簽與非標簽

假設我們有一個StudentList enum,如下所示:

enum StudentList {
    Student1(Student), 
    Student2(Student)
}

定義學生名單

let student1 = Student{name:"tom".to_owned(), student_id:"J19990".to_owned(), pets: vec![], middle_name:Some("middle".to_owned())};
let student2 = Student{name:"dan".to_owned(), student_id:"J19990".to_owned(), pets: vec![], middle_name:Some("middle".to_owned())};

let student_list = vec![StudentList::Student1(student1), StudentList::Student2(student2)];

如果我們像現在一樣打印出JSON,它將如下所示,它是有標簽的,是serde的默認行為。

[
  {
    "Student1": {
      "name": "tom",
      "studentId": "J19990",
      "pets": [],
      "middleName": "middle"
    }
  },
  {
    "Student2": {
      "name": "dan",
      "studentId": "J19990",
      "pets": [],
      "middleName": "middle"
    }
  }
]

如果你希望所有標簽都具有相同的名稱,例如Student,該怎么辦呢?你可能認為可以使用rename_all來實現這一點,但實際上并非如此,應該手動重命名枚舉中的每個變體。

#[derive(Debug, Clone, Serialize, Deserialize)]
enum StudentList {
    #[serde(rename="Student")]
    Student1(Student), 
    #[serde(rename="Student")]
    Student2(Student)
}

輸出如下:

[
  {
    "Student": {
      "name": "tom",
      "studentId": "J19990",
      "pets": [],
      "middleName": "middle"
    }
  },
  {
    "Student": {
      "name": "dan",
      "studentId": "J19990",
      "pets": [],
      "middleName": "middle"
    }
  }
]

不加標簽

如果我們只想要一個簡單的學生數組,而不顯示枚舉變量名稱,該怎么辦?我們可以通過向枚舉中添加#[serde(untagged)]屬性來實現這一點。通過這樣做,我們的輸出將變成:

[
  {
    "name": "tom",
    "studentId": "J19990",
    "pets": [],
    "middleName": "middle"
  },
  {
    "name": "dan",
    "studentId": "J19990",
    "pets": [],
    "middleName": "middle"
  }
]

內部標簽

枚舉的另一種表示形式是內部標簽,讓我們創建一個包含不同學生類型的新枚舉,我們將有班長、副班長和普通學生。

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all="camelCase")]
enum StudentType {
    Regular(Student), 
    Leader(Student), 
    SubLeader(Student)
}

指定serde(tag = "type")將允許我們在內容中使用標簽來識別我們正在處理的變體,如下所示:

[
  {
    "type": "leader",
    "name": "tom",
    "studentId": "J19990",
    "pets": [],
    "middleName": "middle"
  },
  {
    "type": "regular",
    "name": "dan",
    "studentId": "J19990",
    "pets": [],
    "middleName": "middle"
  }
]

相鄰標簽

表示標簽和內容作為同一對象中的兩個字段彼此相鄰。將枚舉的屬性修改如下:

#[serde(tag = "type", content = "student", rename_all="camelCase")]

json數據變成:

[
  {
    "type": "leader",
    "student": {
      "name": "tom",
      "studentId": "J19990",
      "pets": [],
      "middleName": "middle"
    }
  },
  {
    "type": "regular",
    "student": {
      "name": "dan",
      "studentId": "J19990",
      "pets": [],
      "middleName": "middle"
    }
  }
]

可以用Serde做很多很多事情。

責任編輯:武曉燕 來源: coding到燈火闌珊
相關推薦

2023-06-15 17:00:11

Rust循環

2024-01-09 09:27:57

Rust編程泛型

2024-01-07 17:29:10

編程語言線程Rust

2023-05-04 07:33:39

Rust變量常量

2024-09-06 11:34:15

RustAI語言

2024-04-07 00:00:10

Rust枚舉C代碼

2020-04-23 09:33:32

Android 協程開發

2024-08-07 10:18:00

2024-08-08 08:24:53

2022-09-11 20:27:17

UbuntuLinux

2022-05-08 16:42:27

Rust編程語言

2009-06-25 16:49:24

Hibernate

2013-12-13 17:21:14

Lua腳本語言

2023-11-17 12:04:39

GORM并發

2023-04-12 15:25:09

Bytrace鴻蒙

2009-04-10 22:06:09

Vmwareesx虛擬化

2024-05-10 07:31:32

IIS應用程序.NET Core

2015-05-19 11:11:29

JavaScript事件使用指南

2019-11-13 12:39:26

Python 開發編程語言

2009-06-24 10:49:08

Unix
點贊
收藏

51CTO技術棧公眾號

欧美黑人一区二区| 国产精品一级黄片| 亚洲wwwww| 成人免费黄色在线| 国产97在线观看| 三级黄色在线观看| 大奶在线精品| 欧美色爱综合网| 国产成人免费高清视频| 午夜小视频免费| 麻豆精品精品国产自在97香蕉| 亚洲成人免费视| 欧美精品一区二区三区在线四季 | av日韩精品| 一道本成人在线| 亚洲一区二区精品在线| 蜜桃av鲁一鲁一鲁一鲁俄罗斯的| 日韩一区二区三区免费播放| 日韩欧美一级特黄在线播放| 黑人糟蹋人妻hd中文字幕| 99视频在线观看地址| 波多野结衣视频一区| 国产精品亚洲欧美导航| 97超碰人人干| 欧美ab在线视频| 亚洲午夜未满十八勿入免费观看全集| 成人免费a级片| 国产青青草在线| 成人精品视频一区二区三区| 国产精品丝袜白浆摸在线 | 中文字幕在线2019| 伊人久久大香线蕉综合热线 | 2019中文字幕在线观看| 999精品在线视频| 国产精品亚洲片在线播放| 日韩视频中午一区| 可以看污的网站| 欧美日韩亚洲国产| 欧美午夜宅男影院在线观看| 97超碰国产精品| 免费a级在线播放| 欧美高清一级片在线观看| 久久综合色一本| 无码h黄肉3d动漫在线观看| 国产白丝精品91爽爽久久| 国产欧美中文字幕| 国产99久久久久久免费看| 亚洲综合二区| 6080yy精品一区二区三区| 黄页网站免费观看| 欧美fxxxxxx另类| 九九视频直播综合网| 婷婷激情四射网| 久久影视一区| xxxxxxxxx欧美| 国产免费嫩草影院| 99精品电影| 日韩一区二区三区xxxx| 伊人影院综合网| 日韩在线视屏| 色噜噜国产精品视频一区二区| 亚洲天堂网一区| 日韩一区二区三区在线免费观看| 中文字幕一区二区在线观看| 先锋影音日韩| 亚洲天天影视| 亚洲色图欧美激情| 国产一级黄色录像片| 婷婷色在线播放| 亚洲午夜久久久久久久久久久| 免费成人在线观看av| 人人九九精品| 中文乱码免费一区二区| 亚洲三区四区| 2024最新电影免费在线观看| 亚洲精品免费看| 日韩精品在线观看av| 97在线视频免费观看完整版| 精品久久香蕉国产线看观看亚洲| 日本亚洲自拍| 中文字幕在线视频区| 中文字幕中文字幕在线一区 | 色一情一乱一伦一区二区三区日本| 日本福利在线| 亚洲免费观看高清完整版在线观看熊| 精品无人区一区二区三区 | 亚洲精品aⅴ中文字幕乱码 | 国产精品影视在线| 国产精品乱码| 国产在线免费观看| 亚洲精品综合在线| 国产亚洲欧美在线视频| 国产成人a视频高清在线观看| 亚洲精品久久7777| 青青青在线观看视频| av中文在线资源库| 欧美日韩一区二区不卡| 好吊操视频这里只有精品| 亚洲免费专区| 欧美成人午夜激情视频| a v视频在线观看| 嫩呦国产一区二区三区av| 51社区在线成人免费视频| 在线日本中文字幕| 久久成人麻豆午夜电影| 51国偷自产一区二区三区的来源| 日韩高清精品免费观看| 久久一本综合频道| 91在线观看免费观看| 欧美一级一区二区三区| 中文字幕av一区二区三区免费看 | 欧美理论电影在线观看| 亚洲国产精一区二区三区性色| 1024精品久久久久久久久| 韩国日本不卡在线| 一区二区视频免费| 91社区在线播放| 可以在线看黄的网站| videos性欧美另类高清| 欧美mv和日韩mv的网站| 国产欧美一区二区三区在线观看视频| 国产欧美日韩影院| 欧美日韩国产成人在线观看| 做爰视频毛片视频| 久久新电视剧免费观看| 国产欧美日韩小视频| 欧美日韩va| 亚洲欧美在线看| 国产主播在线播放| 狠狠狠色丁香婷婷综合激情| 日本婷婷久久久久久久久一区二区| 黑人与亚洲人色ⅹvideos| 亚洲高清免费视频| 人妻体体内射精一区二区| 国产亚洲电影| 日韩69视频在线观看| 日韩一区二区三区不卡| 一二三区精品视频| 成人免费播放视频| 亚洲激情久久| 亚洲精品免费网站| 毛片在线播放a| 欧美日韩在线不卡| 久久久久久成人网| 美女免费视频一区二区| 秋霞毛片久久久久久久久| 在线观看的黄色| 亚洲福利视频二区| 五月天婷婷网站| 高清国产一区二区| 国产 欧美 日韩 一区| 美国十次综合久久| 欧美精品免费在线观看| 国产成人三级在线播放| 亚洲精品成人a在线观看| 992kp免费看片| 亚洲激情中文在线| 91超碰在线免费观看| 羞羞视频在线观看免费| 精品三级在线看| 久久精品无码人妻| 波多野结衣91| 最近免费中文字幕中文高清百度| 91视频成人| 欧美成人精品在线| 日本精品999| 高跟丝袜一区二区三区| 欧美性xxxx图片| 日韩精品午夜视频| 亚洲人一区二区| 日本欧美在线| 欧美黄色三级网站| 无码国产色欲xxxx视频| 色综合中文综合网| 成人一级片免费看| 国产乱码精品一品二品| 欧美又粗又长又爽做受| 亚洲va久久久噜噜噜久久| 国产精品高清在线观看| 老司机99精品99| 欧美成人aa大片| 五月天激情四射| 国产精品白丝在线| 成人在线电影网站| 日韩精品久久久久久| 特级黄色录像片| 老司机精品视频在线播放| 国产精品久久久久9999| 超碰人人在线| 精品一区精品二区| 国产精品久久无码一三区| 亚洲午夜精品在线| 尤物视频最新网址| 国产九九视频一区二区三区| 国产中文字幕视频在线观看| 日韩aaaa| 国内精品视频免费| 欧美91在线|欧美| 久久久久久国产精品美女| 久草在现在线| 日韩视频中午一区| 亚洲 小说区 图片区| 亚洲专区一二三| 97人妻人人揉人人躁人人| 国产精品99久久久| 国产又粗又长又大的视频| 欧美三区美女| 亚洲成人午夜在线| 欧美a级网站| 亚洲字幕在线观看| 精品无人乱码一区二区三区| 久久久久久久激情视频| av网站在线免费播放| 亚洲成人网在线| 国产精品无码在线播放| 欧美色另类天堂2015| 天天看片中文字幕| 久久免费的精品国产v∧| 少妇性l交大片7724com| 日本女人一区二区三区| 老太脱裤让老头玩ⅹxxxx| 亚洲精品小说| 五月婷婷一区| 亚洲精品合集| 国内一区二区三区在线视频| 国产一区二区三区免费在线| 国产精品第三页| 性欧美freesex顶级少妇| 欧美情侣性视频| 黄色免费在线观看| 中文字幕在线日韩| 风间由美一区| 亚洲欧美中文日韩v在线观看| 无码人妻丰满熟妇区五十路 | 国产亚洲激情| 好吊色视频988gao在线观看| 水蜜桃精品av一区二区| 日韩精品大片| 精品国产一区二区三区小蝌蚪 | 在线视频一二三区| 国内自拍亚洲| 国产精品久久久久久久久久ktv| 老司机午夜在线视频| 色狠狠久久aa北条麻妃| 婷婷在线视频观看| www.日韩.com| 黄色一级大片在线免费看产| 日韩中文字幕免费视频| 日本免费在线观看| 日韩视频免费在线| 黄色精品在线观看| 色综合天天狠天天透天天伊人| 男女污污视频在线观看| 精品亚洲一区二区| 久久天堂电影| 亚洲天堂av网| av网站在线免费观看| 日韩一区二区欧美| 日韩免费影院| 欧洲精品在线视频| 国产精品毛片久久久久久久久久99999999 | jizzzz日本| 蜜桃精品视频在线| 一级做a免费视频| 激情丁香综合五月| 亚洲第一色av| 国产一区二区日韩精品| 一卡二卡三卡四卡五卡| 风流少妇一区二区| 中文字幕乱视频| 91在线精品一区二区三区| 国产肥白大熟妇bbbb视频| 国产午夜精品福利| av片在线免费看| 亚洲精品久久嫩草网站秘色| 青青草原免费观看| 午夜在线电影亚洲一区| 在线观看日本网站| 欧美在线不卡视频| 国产精品久久影视| 亚洲黄在线观看| 你懂的在线播放| 深夜福利一区二区| 青草av在线| 日本a级片电影一区二区| 黑人极品ⅴideos精品欧美棵| 最好看的2019年中文视频| 久久综合网导航| 久久久久久免费精品| 中文字幕 在线观看| 国产精品美女久久久免费| 91麻豆精品国产综合久久久| 国产精品一国产精品最新章节| av久久网站| 亚洲最大福利视频| 亚洲桃色综合影院| 香蕉精品视频在线| 狠狠久久婷婷| 亚欧激情乱码久久久久久久久| 亚洲精品三级| 亚洲黄色av网址| av网站免费线看精品| 国产精品久久久久久久av| 亚洲乱码日产精品bd| 少妇太紧太爽又黄又硬又爽| 色呦呦一区二区三区| 国产熟女精品视频| 亚洲精品一区二区在线| 七七久久电影网| 国产精品久久久久久久久久三级 | 91av视频免费观看| 国产精品一区二区你懂的| 久久丫精品忘忧草西安产品| 亚洲丝袜自拍清纯另类| 国产中文字字幕乱码无限| 7777精品伊人久久久大香线蕉最新版| aaa在线视频| 欧美一区2区视频在线观看| 成人高清在线| 97久久久免费福利网址| 日韩中文字幕| 亚洲欧美日韩国产成人综合一二三区| 国产亚洲第一伦理第一区| 日韩av新片网| 久久超碰97中文字幕| yy6080午夜| 亚洲国产视频直播| 一二三四区在线| 亚洲电影免费观看高清| av理论在线观看| 国产精品观看在线亚洲人成网 | 国产精品亚洲一区二区三区| 欧美激情三级| 亚洲mv在线看| 日韩电影免费在线看| av在线网站观看| 亚洲一区视频在线观看视频| 国产精品视频a| 在线亚洲男人天堂| jizz亚洲女人高潮大叫| 久久资源av| 亚洲美女毛片| 五月天丁香社区| 亚洲综合丁香婷婷六月香| 国产成人精品一区二三区四区五区| 欧美一区二区三区爱爱| 欧美理论在线观看| 91国产视频在线| 粉嫩精品导航导航| 99久久久精品视频| 六月丁香婷婷色狠狠久久| 欧美福利在线视频| 欧美三级中文字幕在线观看| 最新国产在线观看| 国产精品男人爽免费视频1| 国产免费av一区二区三区| 中文字幕有码av| 日本一二三不卡| 99久久精品国产一区色| 久久精品美女视频网站| 亚洲网站免费| 欧洲金发美女大战黑人| 国产精品综合二区| 国产午夜激情视频| 亚洲国产精品人人爽夜夜爽| av丝袜在线| 日本免费一区二区三区| 日韩av在线免费观看不卡| 日韩精品久久久久久久的张开腿让| 一区二区三区免费看视频| 99热这里只有精品3| 欧美激情中文字幕在线| 红杏成人性视频免费看| 国产视频在线观看网站| 91亚洲国产成人精品一区二区三 | 国产女人高潮时对白| 日韩在线观看免费高清| 亚洲国产高清在线观看| 99热久久这里只有精品| 91在线免费视频观看| 亚洲一级片免费看| 欧美成年人视频| 久久男人av| 免费观看成人网| 国产精品另类一区| 午夜精品久久久久久久爽| 国内精品免费午夜毛片| 国产精品亚洲片在线播放| 一本色道久久亚洲综合精品蜜桃| 91美女在线观看| 日韩久久久久久久久久| 久久精品久久久久| 久久视频在线观看| 在线看的黄色网址| 亚洲视频免费观看| 日本人妻丰满熟妇久久久久久| 精品久久国产精品| 欧美影院天天5g天天爽| 亚洲少妇久久久| 午夜精品福利久久久|