Rust解析YAML,结构体序列化和反序列化
serde_yaml是Rust的一个crate,提供了支持将数据结构序列化为YAML格式,以及将YAML格式反序列化为Rust数据结构的功能。本文将演示如何在Rust中使用serde_yaml;
添加依赖
要使用serde_yaml
解析YAML文本,需先为项目添加相应的依赖,编辑Cargo.toml
文件,添加以下内容:
[dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_yaml = "0.9"
将YAML解析(反序列化)到结构体
serde_yaml提供一个serde_yaml::from_str
函数用于解析&str
类型的YAML字符串,且能自动映射到Rust中的数据结构中;
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize)]
struct Config {
ip: String,
port: u16,
}
fn main() {
let yaml = "
ip: 127.0.0.1
port: 34567
";
let config:Config = serde_yaml::from_str(&yaml).unwrap();
println!("{}:{}",config.ip,config.port);
}
程序运行结果
127.0.0.1:80
将数据结构转换成YAML字符串(序列化)
serde_yaml提供一个serde_yaml::to_string
函数用于将Rust中的结构体转换成YAML字符串;
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize)]
struct Config {
ip: String,
port: u16,
}
fn main() {
let config = Config{
ip: "127.0.0.1".to_string(),
port: 80
};
let yaml = serde_yaml::to_string(&config).unwrap();
println!("{}",yaml);
}
程序运行结果
ip: 127.0.0.1 port: 80
使用YAML的!tag语法
枚举使用!tag
语法标记进行序列化,以识别变体名称;
use serde::{Serialize, Deserialize};
#[derive(Debug, Serialize, Deserialize)]
enum Config {
Name(String),
Point{x:f64, y:f64},
Elements(usize, usize, usize),
}
fn main() {
let yaml1 = "
- !Name perfcode.com
- !Point {x: 1.0, y: 2.0}
- !Elements [1, 2, 3]
";
let v1: Vec<Config> = serde_yaml::from_str(yaml1).unwrap();
println!("{:?}\n{:?}\n{:?}",v1[0],v1[1],v1[2]);
let yaml2 = "
- !Name perfcode.com
- !Point
x: 1.0
y: 2.0
- !Elements
- 1
- 2
- 3
";
let v2: Vec<Config> = serde_yaml::from_str(yaml2).unwrap();
println!("{:?}\n{:?}\n{:?}",v2[0],v2[1],v2[2]);
}
程序运行结果
Name("perfcode.com") Point { x: 1.0, y: 2.0 } Elements(1, 2, 3) Name("perfcode.com") Point { x: 1.0, y: 2.0 } Elements(1, 2, 3)