Rust Serde—是否可以将两种不同布局中的json数据映射回单个结构?
我试图映射到结构的数据有两种格式: 使用Rust Serde—是否可以将两种不同布局中的json数据映射回单个结构?,json,rust,deserialization,json-deserialization,serde,Json,Rust,Deserialization,Json Deserialization,Serde,我试图映射到结构的数据有两种格式: 使用卡\u面,当卡上有多个面时: { "object": "card", "id": "some_id", "lang": "en", "released_at": "2012-02-03", "card_faces": [ { "name": "some_name", "cost": "5", "ctype": "some_type", "colors": [ "R"
卡\u面
,当卡上有多个面时:
{
"object": "card",
"id": "some_id",
"lang": "en",
"released_at": "2012-02-03",
"card_faces": [
{
"name": "some_name",
"cost": "5",
"ctype": "some_type",
"colors": [
"R",
"B"
]
},
{
"name": "another_name",
"cost": "",
"ctype": "another_type",
"colors": [
"R",
"B"
]
}
],
"set_code": "some_code"
}
当只有一个面(面字段仅放在根目录中)时,没有卡片面
:
我希望我的结构始终有一个Vec
字段。比如:
#[derive(Deserialize)]
struct Card {
object: String,
id: String,
lang: String,
released_at: String,
faces: Vec<CardFace>,
set_code: String,
}
#[派生(反序列化)]
结构卡{
对象:字符串,
id:String,
朗:弦,
发布时间:String,
面孔:Vec,
set_代码:String,
}
是否可以反序列化这些对象并将面字段强制转换为所需的格式,或者在反序列化之前我是否需要操作json?我将使用中介
枚举执行此操作:
#[派生(反序列化)]
#[塞尔德(未标记)]
枚举卡TMPDESER{
卡片{
对象:字符串,
id:String,
朗:弦,
发布时间:String,
卡片面:Vec,
set_代码:String,
},
单张卡{
对象:字符串,
id:String,
朗:弦,
发布时间:String,
名称:String,
成本:字符串,
ctype:String,
颜色:Vec,
set_代码:String,
},
}
使用#[serde(untaged)]
属性,您可以透明地反序列化现有的两种数据
现在只需用#[serde(from=“CardTmpDeser”)]标记实际结构即可。
:
#[派生(调试、反序列化)]
#[serde(from=“CardTmpDeser”)]
发布结构卡{
对象:字符串,
id:String,
朗:弦,
发布时间:String,
卡片面:Vec,
set_代码:String,
}
为卡执行中的,您就可以开始了serde
将使用CardTmpDeser
自动反序列化数据,但将透明地将其转换为最终类型
()我只想补充一点,不管是谁设计了这样的JSON,他一定恨别人:只是请不要这样做,孩子们。
#[derive(Deserialize)]
struct Card {
object: String,
id: String,
lang: String,
released_at: String,
faces: Vec<CardFace>,
set_code: String,
}