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

分类: 计算机技术
推荐阅读:
System has not been booted with systemd as init system (PID 1). Can't operate.解决方法 在WSL(Windows Subsystem for Linux,适用于Linux的Windows子系统)下通过systemctl命令启动某些服务将造成System has not been booted with systemd as init system (PID 1). Can't operate.这样的错误;
没有main()函数的C语言程序 有两种方法可以不添加main()函数来运行C语言程序,第一种用#define预处理指令,第二种是使用-nostartfiles编译选项;
function main is undeclared in the main package解决办法 这是一个Golang新手可能会碰到的低级错误,它表明你的main包中不包含main()函数;
Golang实现HTTP代理服务 这篇文章的目的是教大家如何使用Go语言实现一个简单的HTTP代理服务程序;HTTP代理服务就是转发客户端发送的网络请求到远程服务器,得到远程服务器的响应后将响应内容返回给客户端。
Rust中的函数 函数在所有编程语言中都非常普遍,也非常重要;在Rust中,可以使用 fn 关键字来声明一个函数;
Python bool()函数详细教程 bool()函数用于对任何对象进行逻辑值的检测,返回True或False;