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

分类: 计算机技术
推荐阅读:
PyQt:使用QVBoxLayout实现垂直布局 所谓的布局,你可以理解为窗口上控件(部件)的排版方式;使用 Layout 进行布局,窗口上的部件能随窗口大小的变化而变化;在本文中,你将掌握在Python中使用 QVBoxLayout 来进行垂直布局;
Linux系统删除目录下的所有空目录 在Linux系统下,你如果想删除某个目录下所有的空目录,那你可以通过这一条命令实现:
Python oct()函数 oct() 是 Python 的内置函数之一,用于将整数转换为八进制字符串。
SQL删除数据库 如果要删除现有的数据库,则可以使用DROP DATABASE语句;
Golang实现HTTP代理服务 这篇文章的目的是教大家如何使用Go语言实现一个简单的HTTP代理服务程序;HTTP代理服务就是转发客户端发送的网络请求到远程服务器,得到远程服务器的响应后将响应内容返回给客户端。
什么是函数原型? 函数原型包括函数的名称、参数列表以及返回类型,但不包含函数体内的具体实现代码。函数原型的作用是为编译器提供关于函数的基本信息,以便在程序中正确地调用和使用该函数。