使用 serde_yaml 在 Rust 中解析 yaml

Parsing yaml in Rust using serde_yaml

我是 Rust 的新手。我正在尝试使用 serde_yaml 在 Rust 中解析 yaml,但无法编译代码:

我的Cargo.toml:

[package]
name = "apmdeps"
version = "0.1.0"
authors = ["Roger Rabbit"]
edition = "2018"

[dependencies]
git2 = "0.10"
serde = { version = "1.0", features = ["derive"] }
serde_yaml = "0.8"

我尝试修改 serde_yaml website 上的代码示例,但无济于事:

use serde::{Deserialize, Serialize};

#[derive(Debug, PartialEq, Serialize, Deserialize)]
struct Dependency {
    url: String,
    tag: String,
}

#[derive(Debug, PartialEq, Serialize, Deserialize)]
struct Project {
    dependencies: Vec<Dependency>,
}

fn main() {
    let s = "---\ndependencies:\n--url:http://test1\ntag:tag1\n--url:http://test2\ntag:tag2";

    let project: Project = serde_yaml::from_str(&s);
}

我收到以下错误:

error[E0308]: mismatched types
  --> src/main.rs:17:28
   |
17 |     let project: Project = serde_yaml::from_str(&s);
   |                            ^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `Project`, found enum `std::result::Result`
   |
   = note: expected type `Project`
              found type `std::result::Result<_, serde_yaml::error::Error>`

你的问题是 serde_yaml::from_str(&s) 并不像你期望的那样 return 直接是一个 Dependency 结构,而是一个 Result 结构。

结果结构是 Rust 的错误处理方式。结果是 Ok(value)Err,您需要检查它是哪一个。通常在 match 表达式中。 在您的情况下,如果解析字符串成功,则解析的依赖项包含在 Ok(project) 中。

我可以让您的代码使用以下匹配表达式进行编译:

let project_result : Result<Project, _> = serde_yaml::from_str(&s);

match project_result {
    Ok(project) => println!("dependencies = {:?}", project),
    Err(_) => println!("Error!")
}

然而,下一个问题是您的字符串似乎不正确的 yaml,至少不像 serde 预期的那样,我确实从程序中得到 "Error!"。

我将您的字符串更改为以下内容以获得一些有用的输出。不过,我不知道这是否是您想要的 yaml。

let s = "---\ndependencies:\n - {url: http://test1, tag: tag1}\n - {url: http://test2, tag: tag2}\n";