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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 12:21:03