使用serde_yaml映射Enum与Struct时YAML解析报错求助
问题分析与修复
你的报错主要来自三个核心问题:
- YAML结构与目标类型不匹配:YAML开头的
-表示这是一个数组,但你代码里要反序列化的是单个Blocdef实例,而非Vec<Blocdef>。 - Enum变体的YAML写法错误:Tuple类型的Enum变体在YAML中不需要为结构体参数指定类型名(
Inputdeck:),直接传入结构体的键值对即可,serde会自动匹配对应的结构体类型。 - 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
相关产品推荐
相关产品推荐

