由于 serde 庫(kù)默認(rèn)使用 JSON 格式進(jìn)行序列化和反序列化
因此程序?qū)⑹褂?JSON 格式對(duì)數(shù)據(jù)進(jìn)行序列化和反序列化
社區(qū)為 Serde 實(shí)現(xiàn)的部分?jǐn)?shù)據(jù)格式列表:
- JSON:廣泛使用的 JavaScript 對(duì)象符號(hào),用于許多 HTTP API
- Postcard:no_std 和嵌入式系統(tǒng)友好的緊湊二進(jìn)制格式。
- CBOR:用于小消息大小且無(wú)需版本協(xié)商的簡(jiǎn)潔二進(jìn)制對(duì)象表示法。
- YAML:自稱為“人類友好”的配置語(yǔ)言(不是標(biāo)記語(yǔ)言)。
- MessagePack:類似于緊湊 JSON 的高效二進(jìn)制格式。
- TOML:Cargo 使用的最小配置格式。
- Pickle:Python 世界中常見(jiàn)的格式。
- RON:一種 Rust 對(duì)象表示法。
- BSON:MongoDB 使用的數(shù)據(jù)存儲(chǔ)和網(wǎng)絡(luò)傳輸格式。
- Avro:用于 Apache Hadoop 內(nèi)部的二進(jìn)制格式,支持模式定義。
- JSON5:包括 ES5 中的某些生成的 JSON 超集。
- URL 查詢字符串,x-www-form-urlencoded 格式。
- Starlark:由 Bazel 和 Buck 構(gòu)建系統(tǒng)用于描述構(gòu)建目標(biāo)的格式。(僅序列化)
- Envy:將環(huán)境變量反序列化為 Rust 結(jié)構(gòu)的一種方式。(僅反序列化)
- Envy Store:將 AWS Parameter Store 參數(shù)反序列化為 Rust 結(jié)構(gòu)的一種方式。(僅反序列化)
- S-表達(dá)式:Lisp 語(yǔ)言系列使用的代碼和數(shù)據(jù)的文本表示形式。
- D-Bus 的二進(jìn)制線格式。
- FlexBuffers:Google 的 FlatBuffers 無(wú)拷貝序列化格式的無(wú)模式表兄弟。
- Bencode:BitTorrent 協(xié)議中使用的簡(jiǎn)單二進(jìn)制格式。
- Token 流,用于處理 Rust 過(guò)程宏輸入。(僅反序列化)
- DynamoDB 項(xiàng):rusoto_dynamodb 用于與 DynamoDB 傳輸數(shù)據(jù)的格式。
- Hjson:圍繞人類閱讀和編輯而設(shè)計(jì)的 JSON 語(yǔ)法擴(kuò)展。(僅反序列化)
serde學(xué)習(xí)
use serde::{
Serialize, Deserialize};
// `derive` may only be applied to `struct`s, `enum`s and `union`s
#[derive(Serialize, Deserialize, Debug)]
struct Animal {
name: String,
age: u32,
}
fn main() {
let animal = Animal {
name: "Dog".to_owned(),
age: 1,
};
let json_str = serde_json::to_string(&animal).unwrap();
println!("{}", json_str);
let json_str1 = r#"{"name":"Dog","age":1}"#;
// 編譯器無(wú)法推斷變量或函數(shù)的類型,并需要使用類型注解來(lái)明確指定類型
let animal1: Animal = serde_json::from_str(json_str1).unwrap();
println!("{:?}", animal1)
}
更新序列化的鍵
use serde::{
Serialize, Deserialize, Serializer, Deserializer};
#[derive(Serialize, Deserialize, Debug)]
struct Animal {
#[serde(rename = "animal_name")]
NaMe: String,
#[serde(rename = "animal_age")]
AgE: u32,
}
fn main() {
let animal = Animal {
NaMe: "Dog".to_owned(),
AgE: 1,
};
let json_str = serde_json::to_string(&animal).unwrap();
println!("{}", json_str);
let json_str1 = r#"{"animal_name":"Dog","animal_age":1}"#;
// 編譯器無(wú)法推斷變量或函數(shù)的類型,并需要使用類型注解來(lái)明確指定類型
let animal1: Animal = serde_json::from_str(json_str1).unwrap();
println!("{:?}", animal1)
}
打印內(nèi)容如下文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-655443.html
{
"animal_name":"DOG","animal_age":1}
Animal {
NaMe: "dog", AgE: 1 }
更新序列化的值
該場(chǎng)景在業(yè)務(wù)中貌似不會(huì)用到?。?!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-655443.html
use serde::{
Serialize, Deserialize, Serializer, Deserializer};
#[derive(Serialize, Deserialize, Debug)]
struct Animal {
#[serde(serialize_with = "serialize_name", deserialize_with = "deserialize_name")]
// 上述serde僅處理Nme
NaMe: String,
AgE: u32,
}
// 使用 serde 庫(kù)自定義的序列化和反序列化函數(shù)
// 在序列化和反序列化期間自定義字段的名稱,并使用自定義的名稱序列化和反序列化數(shù)據(jù)
fn serialize_name<S>(name: &String, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
// 將輸入字符串轉(zhuǎn)換為大寫并序列化
serializer.serialize_str(&name.to_uppercase())
}
fn deserialize_name<'de, D>(deserializer: D) -> Result<String, D::Error>
where
D: Deserializer<'de>,
{
let name = String::deserialize(deserializer)?;
// 獲取輸入字符串 name,并使用 name.to_lowercase() 將其轉(zhuǎn)換為小寫形式
Ok(name.to_lowercase())
}
fn main() {
let animal = Animal {
到了這里,關(guān)于rust學(xué)習(xí)-json的序列化和反序列化的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!