You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用serde_yaml映射Enum与Struct时YAML解析报错求助

问题分析与修复

你的报错主要来自三个核心问题:

  1. YAML结构与目标类型不匹配:YAML开头的-表示这是一个数组,但你代码里要反序列化的是单个Blocdef实例,而非Vec<Blocdef>。
  2. Enum变体的YAML写法错误:Tuple类型的Enum变体在YAML中不需要为结构体参数指定类型名(Inputdeck:),直接传入结构体的键值对即可,serde会自动匹配对应的结构体类型。
  3. YAML语法格式问题:标签后的数组元素间需要添加空格,否则会被解析为错误格式。

修正后的完整代码

use serde::Deserialize;
use std::collections::HashMap;

#[derive(Debug, Deserialize)]
enum Blocdef {
    ConfigLink(String, Inputdeck),
}

#[derive(Debug, Deserialize)]
struct Inputdeck {
    config: HashMap<String, u64>,
}

fn main() -> Result<(), serde_yaml::Error> {
    // 修正后的YAML:移除数组标记-,删除Inputdeck类型标识,修正数组元素空格
    let s = "
!ConfigLink ['NameTest', {config: {'00': 63, '01': 56}}]
";
    let deck: Result<Blocdef, serde_yaml::Error> = serde_yaml::from_str(&s);
    println!("{:?}", deck);
    Ok(())
}

额外场景适配

如果确实需要反序列化多个Blocdef实例的数组,只需将目标类型改为Result<Vec<Blocdef>, serde_yaml::Error>,同时保留YAML开头的-,示例如下:

// 修改后的main函数片段
fn main() -> Result<(), serde_yaml::Error> {
    let s = "
- !ConfigLink ['NameTest', {config: {'00': 63, '01': 56}}]
";
    let deck: Result<Vec<Blocdef>, serde_yaml::Error> = serde_yaml::from_str(&s);
    println!("{:?}", deck);
    Ok(())
}

内容的提问来源于stack exchange,提问作者GuiGui

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 16:57:13