如何在Rust中读取YAML文件?

23

我尝试过使用 serde-yamlyaml-rust 这两个 Rust 的 crate,但是我没有看到任何示例。

3个回答

33
serde-yaml的文档包含以下4个函数:
  • from_reader — 从YAML的IO流中反序列化类型为T的实例。
  • from_slice — 从YAML文本的字节中反序列化类型为T的实例。
  • from_str — 从YAML文本字符串中反序列化类型为T的实例。
  • from_value — 将serde_yaml::Value解释为类型为T的实例。

以使用from_reader为例:

use serde_yaml; // 0.8.7

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let f = std::fs::File::open("something.yaml")?;
    let d: String = serde_yaml::from_reader(f)?;
    println!("Read YAML string: {}", d);
    Ok(())
}

something.yaml:

"I am YAML"

如果您不知道格式(例如此示例中的String),则可以反序列化为松散类型Value,但一定要阅读Serde指南以获取有关如何执行类型导向序列化和反序列化的完整详细信息。
另请参见: 通常,使用任何 Serde 格式与其余所有格式几乎相同。

1
这个例子返回 Error: Scan(ScanError { mark: Marker { index: 7, line: 2, col: 4 }, info: "mapping values are not allowed in this context" });自你的回答 @Shepmaster 以来有什么变化吗? - Ben
1
@Ben 听起来你的 YAML 文件格式不正确,或者与你尝试解析的类型不匹配。 - Shepmaster
抱歉(我是 Rust 初学者); 我更想尝试解析键/值形式的 YAML 文件(类似于 a: 'b' 这样的一行代码),以便开始入门。但我猜这远超出了初始问题的范围。 - Ben
1
@Ben,"如果您不知道格式,可以将其反序列化为松散类型的值"和"阅读Serde指南以获取有关如何进行类型导向的完整详细信息"所指的内容。 - Shepmaster

14

这个例子使用了 yaml_rust 的库。

use std::fs::File;
use std::io::prelude::*;
use yaml_rust::yaml::{Hash, Yaml};
use yaml_rust::YamlLoader;

fn main() {
    println!("Hello, Yaml");
    let file = "./etc/my_yaml_file.yaml";
    load_file(file);
}

fn load_file(file: &str) {
    let mut file = File::open(file).expect("Unable to open file");
    let mut contents = String::new();

    file.read_to_string(&mut contents)
        .expect("Unable to read file");

    let docs = YamlLoader::load_from_str(&contents).unwrap();

    // iterate / process doc[s] ..
}

1
还可以考虑使用std::fs::read_to_string来读取文件内容。 - Matthias Braun

3

如果您想要正确地完成这项任务,可以参考Shepmaster的答案。以下是一个完整的示例供您开始使用。

data['foo']['bar'].as_str()返回一个Option<str>

fn example() -> Result<String> {
    let f = std::fs::File::open("something.yaml")?;
    let data: serde_yaml::Value = serde_yaml::from_reader(f)?;
    data["foo"]["bar"]
        .as_str()
        .map(|s| s.to_string())
        .ok_or(anyhow!("Could not find key foo.bar in something.yaml"))
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接