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

分类: 计算机技术
推荐阅读:
Linux删除所有与扩展名不匹配的文件 在Linux系统下,当你想删除某个文件夹下没有指定扩展名的所有文件时,你可以使用这条命令来实现,它将会删除目录下所有与扩展名不匹配的文件:
Python 异常处理及常见错误 一般情况下,在python无法正确处理程序时,就会发生异常;当发生异常时,我们需要捕获它并进行处理,否则程序会终止运行。
Python生成n个元素的全排列 本文将使用Python语言编写程序生成n个元素的全排列,代码不使用第三方库;
如何禁用VSCode后台自动更新 VSCode是我比较喜欢的IDE了,但它也会偷偷摸摸的下载更新并自动安装,而且频率非常高;我并不太喜欢软件在自己毫不知情的情况下自动完成更新,所以我决定禁止它的这种行为;
Rust todo宏的用法与示例 在Rust中,todo宏在代码中标记尚未实现或尚未完成的部分;当你在开发过程中遇到需要实现但展示没有完成的功能时,可以使用todo宏来提醒自己或其它开发者,以便稍后返回并完成这部分。
Pyinstaller 助手 Pyinstaller助手是一个针对Pyinstaller打包工具的图形化应用程序,旨在简化Python项目的打包过程。通过Pyinstaller助手,用户可以轻松地将他们的Python代码转换成独立的可执行文件,而无需深入了解Pyinstaller的复杂命令行参数和配置选项。