Rust 如何将serde_json与enum之类的联合类型一起使用?
我有两个结构,我想用标记序列化/反序列化为JSON中的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); //这将产生预期的结
“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,这将是不同事物的组合。包装器类型+序列化以添加内部标记。检查一些你需要的东西