【发布时间】:2018-11-10 21:56:15
【问题描述】:
我已经戳了一下serde-yaml 和yaml-rust 板条箱,但我还没有看到任何示例。
【问题讨论】:
我已经戳了一下serde-yaml 和yaml-rust 板条箱,但我还没有看到任何示例。
【问题讨论】:
serde-yaml's documentation有以下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<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 guide以获取有关如何执行类型导向的完整详细信息序列化和反序列化。
另见:
一般来说,使用 any Serde 格式与其他所有格式几乎相同。
【讨论】:
Error: Scan(ScanError { mark: Marker { index: 7, line: 2, col: 4 }, info: "mapping values are not allowed in this context" });自从你回答@Shepmaster 后有什么变化吗?
a: 'b' 这样的单行)来开始)。但我想这远远超出了这里最初问题的范围
本例使用yaml_rust crate
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] ..
}
【讨论】:
如果你想正确地做到这一点,上面的答案很好。这是一个完整的入门示例。
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"))
}
【讨论】: