使用 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";
我是 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";