Rust Serde tag=x,但将标记保留在结构中

Rust Serde tag=x,但将标记保留在结构中,rust,serde,Rust,Serde,我正在尝试使用内部标记的JSON()将JSON反序列化为带有枚举变量的Rust结构 我想将变量的标记存储在结构中-当前serde将此数据存储在属性中 将标记键保留在结构中可以做到这一点吗 我尝试过的方法: A.#[serde(未标记)] 这是可行的,但我想避免它,因为搜索模式匹配会影响性能 B.#[serde(tag=“f_tag”)] 这不起作用,导致重复字段'f_tag` serde属性和枚举变量重命名都尝试使用相同的键 我不想将#[serde(rename=“f_tag”)

我正在尝试使用内部标记的JSON()将JSON反序列化为带有枚举变量的Rust结构

我想将变量的标记存储在结构中-当前serde将此数据存储在属性中

将标记键保留在结构中可以做到这一点吗

我尝试过的方法:

  • A.
    #[serde(未标记)]

    • 这是可行的,但我想避免它,因为搜索模式匹配会影响性能
  • B.
    #[serde(tag=“f_tag”)]

    • 这不起作用,导致
      重复字段'f_tag`

      • serde属性和枚举变量重命名都尝试使用相同的键
    • 我不想将
      #[serde(rename=“f_tag”)]
      放在
      Uni
      下,因为这定义了父枚举中的标记键。(我希望子结构在父枚举中包含的任何位置都具有相同的标记键)

例如:

使用serde::{反序列化,序列化};
使用serde_json::json;
使用serde_json::{Result,Value};
#[派生(序列化、反序列化、调试)]
结构S1{
f1:字符串,
f2:Uni,
}
#[派生(序列化、反序列化、调试)]
#[serde(tag=“f_tag”)]
//#[塞尔德(未标记)]
枚举单位{
串(串),,
//#[serde(rename=“f#u tag”)]
S2(S2),
//#[serde(rename=“f#u tag”)]
S3(S3),
}
#[派生(序列化、反序列化、调试)]
结构S2{
f_标签:S2Tag,
f2_s2:bool,
}
#[派生(序列化、反序列化、调试)]
结构S3{
f_标签:S3标签,
f2_s3:bool,
}
#[派生(序列化、反序列化、调试)]
枚举标记{
#[serde(rename=“s2”)]
S2,
}
#[派生(序列化、反序列化、调试)]
枚举标记{
#[serde(rename=“s3”)]
S3,
}
fn main(){
设s1=s1{
f1:“s1.f1”。插入(),
f2:Uni::S2(S2{
f_标签:S2Tag::S2,
f2_s2:正确,
}),
};
让j=serde_json::to_string(&s1).unwrap();
dbg!(&j);
让s1_2:s1=serde_json::from_str(&j).unwrap();
dbg!(s1_2);
}
{
“f1”:“s1.f1”,
“f2”:{
//问题:serde(tag=x)在此处使用枚举的名称。
“f_标签”:“S2”,
“f_标签”:“s2”,
“f2_s2”:正确
}
}

如果
S2Tag
(etc)只有一个变量,那么可以使用
[serde(tag=“f_tag”)]
[serde(skip_serialization)]
来获得该行为。否则,我觉得您需要创建一个自定义反序列化程序。@vallentin这会导致
缺少字段
f_标记”-似乎Serde在将
f_标记
键与变体匹配后将其删除,从而使结构缺少
f_标记
。我可以添加我所说的内容作为答案。但是,只有当
S*标记
枚举始终只有一个变量时,它才起作用。当然,或者只对编辑的操场代码进行永久链接会很有用-谢谢。如果
S2Tag
(etc)只有一个变量,那么您可以使用
[serde(Tag=“f_Tag”)]
[serde(跳过序列化)]
来获得该行为。否则,我觉得您需要创建一个自定义反序列化程序。@vallentin这会导致
缺少字段
f_标记”-似乎Serde在将
f_标记
键与变体匹配后将其删除,从而使结构缺少
f_标记
。我可以添加我所说的内容作为答案。但是,只有当
S*标记
enum始终只有一个变量时,它才起作用。当然,或者只是永久链接到已编辑的代码会很有用-谢谢。