【问题标题】:How do you read a YAML file in Rust?如何在 Rust 中读取 YAML 文件?
【发布时间】:2018-11-10 21:56:15
【问题描述】:

我已经戳了一下serde-yamlyaml-rust 板条箱,但我还没有看到任何示例。

【问题讨论】:

    标签: rust yaml


    【解决方案1】:

    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 后有什么变化吗?
    • @Ben 听起来您的 YAML 文件格式错误或与您尝试解析的类型不匹配。
    • 嗯对不起(这里是生锈的初学者);我更想解析键/值的 yaml 文件(像 a: 'b' 这样的单行)来开始)。但我想这远远超出了这里最初问题的范围
    • @Ben 这就是“如果你不知道你的格式,你可以反序列化成更宽松的类型值”和“阅读 Serde 指南以了解如何进行类型导向的完整细节”参考.
    【解决方案2】:

    本例使用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] ..
    }
    

    【讨论】:

      【解决方案3】:

      如果你想正确地做到这一点,上面的答案很好。这是一个完整的入门示例。

      data['foo']['bar'].as_str() 返回一个Option&lt;str&gt;

      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"))
      }
      

      【讨论】:

      • 你所说的“上述答案”是指哪个答案?
      猜你喜欢
      • 2020-11-09
      • 2015-09-05
      • 1970-01-01
      • 1970-01-01
      • 2015-12-30
      • 1970-01-01
      • 1970-01-01
      • 2022-08-02
      • 1970-01-01
      相关资源
      最近更新 更多