rust - 使用 `serde_yaml` 反序列化多个文档

标签 rust yaml deserialization serde

我在追加模式下将事件流保存在 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?

我想出了一些看起来可行的解决方案,但我想我会尝试将其发布在答案中,因为我不想让其他答案过于偏向于我的解决方案。我鼓励您也看看它,但是欢迎任何反馈。

最佳答案

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);
    }
}

关于rust - 使用 `serde_yaml` 反序列化多个文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72207805/

相关文章:

rust - 为什么不能在同一结构中存储值和对该值的引用?

rust - 如何让调用者看到方法的特征实现?

latex - 使用 R markdown 为每个页面(包括第一个!)创建页脚

java - 如何修复 application.yml 文件中的解析异常?

java - 使用 XStream 反序列化空 XML 元素

c# - 用户定义的结构和默认(反)序列化

rust - 使用 rustc_serialize 并获取不带引号的字符串

rust - 为什么 Option<&String> 不强制转换为 Option<&str>?

python - Pytest断言语法以及如何从pytest函数调用yml文件

如果属性具有 null 值,尽管 JsonIgnoreCondition.WhenWritingNull,C# JsonSerializer.Deserialize 也会失败