Rust 如何将serde_json与enum之类的联合类型一起使用?

Rust 如何将serde_json与enum之类的联合类型一起使用?,rust,serde,serde-json,Rust,Serde,Serde Json,我有两个结构,我想用标记序列化/反序列化为JSON中的“type”字段,如下所示 #[派生(调试、克隆、序列化、反序列化)] #[serde(tag=“type”)] 结构ThingA{ 值:usize, } #[派生(调试、克隆、序列化、反序列化)] #[serde(tag=“type”)] 结构物{ 值:usize, } 这些文件按预期进行序列化。比如说, 设a=ThingA{value:0}; 普林顿!(“{}”,serde_json::to_string(&a); //这将产生预期的结

我有两个结构,我想用标记序列化/反序列化为JSON中的
“type”
字段,如下所示

#[派生(调试、克隆、序列化、反序列化)]
#[serde(tag=“type”)]
结构ThingA{
值:usize,
}
#[派生(调试、克隆、序列化、反序列化)]
#[serde(tag=“type”)]
结构物{
值:usize,
}
这些文件按预期进行序列化。比如说,

设a=ThingA{value:0};
普林顿!(“{}”,serde_json::to_string(&a);
//这将产生预期的结果:
//{“类型”:“ThingA”,“值”:0}
但是,当我尝试添加一个枚举作为结构的联合类型时,我遇到了麻烦

#[派生(调试、克隆、序列化、反序列化)]
#[serde(tag=“type”)]
枚举事物{
ThingA(ThingA),
ThingB(ThingB),
}
上面的定义可以很好地反序列化JSON,但是在序列化过程中添加了一个额外的字段

let json=r#“{”type:“ThingB”,“value”:0}”;
让thing:thing=serde_json::from_str(json)?;
//正确解析为:
//ThingB(ThingB{value:0})
普林顿!(“{}”,serde_json::to_string(&thing);
//使用额外的“类型”字段不正确地序列化:
//{“类型”:“ThingB”,“类型”:“ThingB”,“值”:0}
对象
枚举上的
#[serde(tag=“type”)]
更改为
#[serde(untaged)]
会导致相反的问题:
对象
实例正确序列化,但不再正确解析

我的目标是让JSON
{“type”:“ThingB”,value:0}
在反序列化期间计算为
Thing::ThingB(ThingB{value:0})
,反之亦然,但前提是我要反序列化为
Thing
。如果我有一个未包装的
ThingB
,比如
ThingB{value:0}
,我希望它也序列化为
{“type”:“ThingB”,value:0}


因此,我的问题是:有没有办法分配serde
标记
未标记
属性,使其仅在序列化/反序列化期间应用(类似于serde的
重命名
)?如果没有,关于如何实现
序列化
和/或
反序列化
以实现我的目标,有什么建议吗?

您可以在
对象
枚举中使用
标记
,保持其他对象干净:

使用serde::{序列化,反序列化};//1.0.124
使用serde_json;//1.0.64
#[派生(调试、克隆、序列化、反序列化)]
结构ThingA{
值:usize,
}
#[派生(调试、克隆、序列化、反序列化)]
结构物{
值:usize,
}
#[派生(调试、克隆、序列化、反序列化)]
#[serde(tag=“type”)]
枚举事物{
ThingA(ThingA),
ThingB(ThingB),
}
fn main(){
让json=r#“{”type:“ThingB”,“value”:0}”;
让thing:thing=serde_json::from_str(json).unwrap();
println!(“{}”,serde_json::to_string(&thing).unwrap());
}

按照评论中的要求。
如果我们想同时标记(enum和structs),我们需要制作一些
serde
abracadabra来使用包装器和
使用
。更多信息请访问

谢谢您的回复。问题是,我希望
ThingA
不包装在
东西
枚举中的
在序列化为JSON时也有一个
“type”:“ThingA”
。@danwoz那么你可能需要另一个包装器,在单独使用时使用标记,而不是与枚举一起使用。或者实现一个外部序列化版本。啊,这个想法很有趣。什么是外文序列化版本?这会是手动实现
序列化
/
反序列化
吗?@danwoz,这将是不同事物的组合。包装器类型+序列化以添加内部标记。检查一些你需要的东西