Ric*_* T. 2 yaml rust deserialization serde
我在追加模式下将事件流保存在 YAML 日志文件中,其中每个事件都由一个单独的文档表示,如下所示:
---
type: event
id: 1
---
type: trigger
id: 2
Run Code Online (Sandbox Code Playgroud)
在稍后的某个时刻,我想迭代这些事件,解析每个 via serde_yaml。但据我了解,serde_yaml似乎不支持从单个阅读器解析多个文档,因为没有可用的方法提到它,并且尝试一次解析多个文档会导致错误MoreThanOneDocument。
use std::io::{self, BufRead};
use serde_yaml;
use serde::{self, Deserialize};
#[derive(Deserialize, Debug)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum Message {
Event { id: i32 },
Trigger { id: i32},
}
fn main() -> io::Result<()> {
let yaml = "---\ntype: event\nid: 1\n---\n\ntype: trigger\nid: 2";
let v: Message = serde_yaml::from_reader(yaml.as_bytes()).unwrap();
println!("{:?}", v);
Ok(())
}
Run Code Online (Sandbox Code Playgroud)
我对 Rust 完全陌生,所以也许我完全错过了重点serde,只是不明白如何去做。
请问您如何解析这样的 YAML?
我编写了一些看起来像是可行的解决方案,但我想我会尝试将其发布在答案中,因为我不想让其他答案过于偏向我的解决方案。我鼓励您也看看它,但欢迎任何反馈。
serde_yaml::Deserializer的文档显示了一个与您的非常相似的示例。它会像这样工作:
use serde::Deserialize;
#[derive(Deserialize, Debug)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum Message {
Event { id: i32 },
Trigger { id: i32 },
}
fn main() {
let yaml = "---\ntype: event\nid: 1\n---\ntype: trigger\nid: 2\n";
for document in serde_yaml::Deserializer::from_str(yaml) {
let v = Message::deserialize(document).unwrap();
println!("{:?}", v);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1061 次 |
| 最近记录: |