在下面的YAML文件中:

// 1. book yaml
kind: book
title: Someone's life

publisher: someone
published_at: 2023-02-24T09:31:00Z+09:00
// 2. movie yaml
kind: movie
title: Someone's life

director: someone else

kind是认识到YAML是什么的关键.如果种类是book,这件事就有publisherpublished_at.然而,如果善良是movie,这件事就不是publisher而是director.

在我的简单 idea 中,为了解析它,我必须创建通用的解析 struct . 例如:

#[derive(Serialize, Deserialize, Debug)]
struct General {
  kind: String,
  title: String,
}

使用General struct解析一次,然后获得General类型的解析,然后使用另一个 struct 重新解析. 例如:

#[derive(Serialize, Deserialize, Debug)]
struct Book {
  kind: String,
  title: String,
  publisher: String,
  published_at: String,
}

上面的场景可以工作,但我必须解析两次.但是,这是有效的吗?

推荐答案

你可以用serde's tag attribute来做这个.Playground example

use serde::Deserialize;
use serde_yaml; // 0.8.26

#[derive(Debug, Deserialize)]
#[serde(tag="kind", rename_all="lowercase")]
enum Media {
    Book(Book),
    Movie(Movie),
}

#[derive(Debug, Deserialize)]
struct Book {
    title: String,
    publisher: String,
    published_at: String,
}

#[derive(Debug, Deserialize)]
struct Movie {
    title: String,
    director: String,
}

fn main() {
    let book: Media = serde_yaml::from_str("kind: book
title: Someone's life

publisher: someone
published_at: 2023-02-24T09:31:00Z+09:00").unwrap();

    let movie: Media = serde_yaml::from_str("kind: movie
title: Someone's life

director: someone else").unwrap();

    println!("{book:?}");
    println!("{movie:?}");

}

Rust相关问答推荐

为什么幻影数据不能自动推断?

使用Rust s serde_json对混合数据类型进行优化'

使用模块中的所有模块,但不包括特定模块

支持TLS的模拟HTTP服务器

在决定使用std::Sync::Mutex还是使用Tokio::Sync::Mutex时,操作系统线程调度是考虑因素吗?

原始数组数据类型的默认trait实现

如何计算迭代器适配器链中过滤的元素的数量

正则表达式中的重叠匹配?(铁 rust 正则式发动机)

`actix-web` 使用提供的 `tokio` 运行时有何用途?

Rust 中的静态引用

提取指向特征函数的原始指针

仅在使用 &mut 或线程时borrow 的数据在闭包之外转义?

需要一个有序向量来进行 struct 初始化

在多核嵌入式 Rust 中,我可以使用静态 mut 进行单向数据共享吗?

如何在 Rust 中按 char 对字符串向量进行排序?

为什么要这样编译?

从 Axum IntoResponse 获取请求标头

如何在 use_effect_with_deps 中设置监听器内的状态?

火箭整流罩、tokio-scheduler 和 cron 的生命周期问题

如何将 u8 切片复制到 u32 切片中?