Rust解析TOML,结构体序列化和反序列化

在Rust中,可以使用标准库中的toml模块来解析和生成TOML格式的数据;serdetoml模块集成,可以将TOML字符串解析为任意Rust结构体,或将Rust结构体序列化为TOML格式的字符串。

TOML是一种简单、符合人体工程学且可读的配置格式;Rust的包管理器cargo就使用TOML格式;

以下为Cargo.toml文件的一个例子:

[package]
name = "a1"
version = "0.1.0"
edition = "2021"

[dependencies]
serde = { version = "1.0", features = ["derive"] }
toml = "0.7.3"

添加依赖

要使用tomlserde,需添加依赖,编辑Cargo.toml文件,添加以下内容:

[dependencies]
serde = { version = "1.0", features = ["derive"] }
toml = "0.7.3"

使用toml模块

toml模块提供一个代表TOML表的结构体toml::Table,可以使用它来访问和操作TOML格式的数据;

pub type Table = Map<String, Value>;

其中,Value表示toml::Value,是一个代表TOML值的枚举:

pub enum Value {
    String(String),
    Integer(i64),
    Float(f64),
    Boolean(bool),
    Datetime(Datetime),
    Array(Array),
    Table(Table),
}

解析TOML文档

解析TOML文档最简单的方法是通过Table类型:

use toml::Table;

fn main(){

    let toml_text = r#"
        a = "perfcode.com"
        b = true
        [others]
        c = 3
    "#;

    let value = toml_text.parse::<Table>().unwrap();
    
    println!("{}\n{}\n{}",
        value["a"].as_str().unwrap(),
        value["b"].as_bool().unwrap(),
        value["others"]["c"].as_integer().unwrap(),
    );
}

程序运行结果

perfcode.com
true
3

要获得toml::Table的详细用法,请访问 Rust toml::Table详细用法

使用toml::from_str函数解析

toml模块提供一个toml::from_str函数可将TOML文档转换成toml::Table类型;修改前一个例子:

use toml::Table;

fn main(){

    let toml_text = r#"
        a = "perfcode.com"
        b = true
        [others]
        c = 3
    "#;

    let value:Table = toml::from_str(&toml_text).unwrap();

    println!("{}\n{}\n{}",
        value["a"].as_str().unwrap(),
        value["b"].as_bool().unwrap(),
        value["others"]["c"].as_integer().unwrap(),
    );
}

使用toml::to_string函数转换成字符串

可以使用toml::to_string函数,将toml::Table类型转换成TOML字符串:

use toml::Table;

fn main(){

    let toml_text = r#"
        a = "perfcode.com"
    "#;

    let mut value:Table = toml::from_str(&toml_text).unwrap();

    value.insert("b".to_string(),toml::Value::String("www.perfcode.com".to_string()));

    let new_toml = toml::to_string(&value).unwrap();

    println!("{}",new_toml);

}

程序运行结果

a = "perfcode.com"
b = "www.perfcode.com"

对结构体序列化和反序列化

一个TOML反序列化的例子:

use serde::{Deserialize,Serialize};

#[derive(Deserialize,Serialize)]
struct Config {
    ip: String,
    port: u16,
    others: Others
}

#[derive(Deserialize,Serialize)]
struct Others {
    salt: String,
    use_whitelist: bool,
}

fn main(){

    let tom_text = r#"
        ip = "127.0.0.1"
        port = 80
        [others]
        salt = "xxxxxx"
        use_whitelist = false
    "#;

    let config:Config = toml::from_str(tom_text).unwrap();

    println!("ip: {}\nport: {}\nsalt: {}\nuse_whitelist: {}",
        config.ip,
        config.port,
        config.others.salt,
        config.others.use_whitelist
    );
}

程序运行结果

ip: 127.0.0.1
port: 80
salt: xxxxxx
use_whitelist: false

一个TOML序列化的例子:

use serde::{Deserialize,Serialize};

#[derive(Deserialize,Serialize)]
struct Config {
    ip: String,
    port: u16,
    others: Others
}

#[derive(Deserialize,Serialize)]
struct Others {
    salt: String,
    use_whitelist: bool,
}

fn main(){

    // 序列化
    let new_config = Config {
        ip: "0.0.0.0".to_string(),
        port: 80,
        others: Others {
            salt: "ssssssssss".to_string(),
            use_whitelist: true
        }
    };
    let new_toml = toml::to_string(&new_config).unwrap();
    
    println!("{}",new_toml);
    
}

程序运行结果

ip = "0.0.0.0"
port = 80

[others]
salt = "ssssssssss"
use_whitelist = true

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

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

分类: 计算机技术
推荐阅读:
PySide6 设置按钮(QPushButton)是否可点击(禁用) QPushButton 类有一个名为 enabled 的属性,它用于控制按钮的可用状态。当按钮可用时,用户可以与之交互,点击它执行操作。当按钮不可用时,用户无法与之交互,点击它也不会触发点击事件。
一定有你不知道的Python技巧 Python一直以代码简洁著称;想写出艺术般的代码,需要你掌握各种Python技巧,这些技巧有些是语言特性,有些则是广大程序员的经验心得;今天作者就给大家网罗了一些Python技巧,一起来看看吧。
Python isinstance()函数 在Python中,isinstance()函数用于判断一个对象是否是指定类或类型的实例。
PySide6 事件的传播机制 在PySide6中,界面上的按钮(QPushButton)和QWidget部件都可以定义keyPressEvent来处理键盘按键事件。当按键事件发生时,系统会根据事件的传播机制来确定哪个部件的keyPressEvent方法将被执行。
一条Linux命令生成一个指定长度的随机密码 在Linux系统下,你可以只需要一条命令就可以生成指定长度的随机密码:
通过两个已知点,找出直线(y = kx + b)的方程式 解决方程组 y1 = kx1 + b和y2 = kx2 + b;其中x1,y1,x2,y2是已知变量;k和b是要找到的系数。