使用Serde带tag枚举反序列化时保留type字段的方法咨询
Serde反序列化时保留结构体
type字段的解决方案 问题原因
使用#[serde(tag = "type")]时,Serde默认会消耗输入中的type字段来选择枚举变体,不会将该字段传递给内部结构体。这就导致结构体中重命名自type的ttype字段找不到对应输入,触发missing field 'type'错误。
解决方法
在枚举的tag属性中添加retain选项,让Serde保留type字段供内部结构体反序列化使用,同时给枚举变体显式指定对应的type值。
修改后的完整代码:
use serde::Deserialize; #[derive(Debug, Deserialize)] struct OuterStruct { name: String, value: i64, inner: Wrapper, } #[derive(Debug, Deserialize)] struct structA { #[serde(rename = "type")] ttype: String, field: String, } #[derive(Debug, Deserialize)] struct structB { #[serde(rename = "type")] ttype: String, field: String, } #[derive(Debug, Deserialize)] #[serde(tag = "type", retain)] enum Wrapper { #[serde(rename = "typea")] TypeA(structA), #[serde(rename = "typeb")] TypeB(structB), }
关键说明
#[serde(tag = "type", retain)]:指定用type字段作为枚举标签,同时保留该字段,让内部结构体可以正常读取。- 枚举变体的
#[serde(rename = "...")]:明确变体对应的type字段值,确保和输入数据匹配。 - 修复原代码中结构体字段末尾缺失的逗号,避免编译错误。
内容的提问来源于stack exchange,提问作者Bryant
相关产品推荐
相关产品推荐

