Rust Serde tag=x,但将标记保留在结构中
我正在尝试使用内部标记的JSON()将JSON反序列化为带有枚举变量的Rust结构 我想将变量的标记存储在结构中-当前serde将此数据存储在属性中 将标记键保留在结构中可以做到这一点吗 我尝试过的方法: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”)
- 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始终只有一个变量时,它才起作用。当然,或者只是永久链接到已编辑的代码会很有用-谢谢。