我以附加模式在YAML日志文件中保存了一个事件流,其中每个事件都由一个单独的文档表示,如下所示:
---
type: event
id: 1
---
type: trigger
id: 2
稍后,我想迭代这些事件,通过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(())
}
我对Rust完全是新手,所以也许我完全错过了serde
的要点,只是不知道如何做。
请问您如何解析这样的YAML?
我想出了一个看起来像是可行的解决方案,但我想我会试着把它贴在答案中,因为我不想让其他答案对我的解决方案产生太大的偏见。我真诚地鼓励你也看看它,但是,欢迎任何反馈。
2条答案
按热度按时间a9wyjsp71#
serde_yaml::Deserializer的文档显示了一个与您的示例非常相似的示例。它的工作方式如下:
xpcnnkqh2#
我真的希望通过只使用
serde
和serde_yaml
来找到一个本地解决方案,但在此之前,我让它工作的方式如下。该特征使用一个额外的方法扩展
BufReader
,该方法返回一个可选的拥有的String
(或流末尾的None
),其中仅包含具有单个YAML文档的部分。通过对它进行迭代,可以应用
serde_json::from_str()
将文档解析为Message
结构。我还在rust playground上提供了完整的源代码。