rust - 如何从 serde_yaml::Value 获取嵌套属性?

标签 rust yaml serde

我有以下 YAML 文件

version: '3'
indexed:
  file1: "abc"
  file2: "def"
  file3: 33

我用这段代码阅读它:

pub fn read_conf() -> Result<(), Box<dyn Error>>{
    let f = File::open(".\\src\\conf.yaml")?;
    let d: Mapping = from_reader(f)?;
    let value = d.get(&Value::String("version".into())).unwrap();
    println!("{:?}", value.as_str().unwrap());

    let value = d.get(&Value::String("indexed.file1".into())).unwrap();
    println!("{:?}", value);
    Ok(())
}

产生

"3"
thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', src\libcore\option.rs:345:21

如何实例化 Value 以获得所需的值?

最佳答案

使用链式索引语法:

use serde_yaml::Value; // 0.8.9

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let input = r#"
    version: '3'
    indexed:
      file1: "abc"
      file2: "def"
      file3: 33
    "#;

    let d: Value = serde_yaml::from_str(input)?;

    let f1 = &d["indexed"]["file1"];
    println!("{:?}", f1);

    Ok(())
}

或者更好的是,为一个类型派生 Deserialize 并让它完成艰苦的工作:

use serde::Deserialize; // 1.0.93
use serde_yaml; // 0.8.9
use std::collections::BTreeMap;

#[derive(Debug, Deserialize)]
struct File {
    version: String,
    indexed: BTreeMap<String, String>,
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let input = r#"
    version: '3'
    indexed:
      file1: "abc"
      file2: "def"
      file3: 33
    "#;

    let file: File = serde_yaml::from_str(input)?;
    let f1 = &file.indexed["file1"];

    println!("{:?}", f1);

    Ok(())
}

另见:

关于rust - 如何从 serde_yaml::Value 获取嵌套属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56755277/

相关文章:

docker - 如何使用docker在角度应用程序中传递环境变量

rust - 为什么Serde不能用于Libra的加密目的序列化和反序列化?

Rust 读取 csv 时输入错误

rust - 为什么通过提取方法进行重构会触发借用检查器错误?

rust - 如何仅使用 rustc 而不是 cargo 链接动态 Rust 库?

rust - 安全遍历有向无环图

Python捕获异常时,如何获取行号?

join - Diesel 连接无法推断类型

javascript - 相当于 PHP 的 yaml 中的express app.get ("/:users/:names")?

rust - 在使用Serde进行序列化时,是否有一种方法可以将结构的字段分组,例如 “flatten”属性的逆函数?