我尝试过使用 serde-yaml 和 yaml-rust 这两个 Rust 的 crate,但是我没有看到任何示例。
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指南以获取有关如何执行类型导向序列化和反序列化的完整详细信息。这个例子使用了 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] ..
}
如果您想要正确地完成这项任务,可以参考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"))
}
Error: Scan(ScanError { mark: Marker { index: 7, line: 2, col: 4 }, info: "mapping values are not allowed in this context" })
;自你的回答 @Shepmaster 以来有什么变化吗? - Bena: 'b'
这样的一行代码),以便开始入门。但我猜这远超出了初始问题的范围。 - Ben