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)

原创内容,如需转载,请注明出处;

本文地址: https://www.perfcode.com/rust-serde/serde-yaml.html

分类: 计算机技术
推荐阅读:
shell中运行上一条命令 在Linux系统下,一条简单的命令即可实现运行上一条刚刚运行过的命令;
Cargo Error: failed to get `x` as a dependency of package解决方法 默认情况下,Cargo是通过内置的git库来下载依赖的,有时会因为验证原因导致失败;
Rust中的函数 函数在所有编程语言中都非常普遍,也非常重要;在Rust中,可以使用 fn 关键字来声明一个函数;
使用Python获取目录下的所有文件 要获取一个目录下的所有文件,你可以使用Python中的os和os.path模块。下面是一个获取目录下所有文件的例子代码:
Python eval()函数 在Python中,eval()是一个内置函数,用于将一个字符串作为Python表达式执行,并返回表达式的结果。
Go语言使用闭包实现斐波那契数列 要使用Go语言实现一个闭包来计算斐波那契数列,你可以定义一个函数,该函数返回一个闭包,闭包可以迭代地生成斐波那契数列的下一个数字。