[英]Rust Serde - Is it possible to map json data the could be in two different layouts back to a single struct?
我試圖映射到我的結構的數據有兩種格式:
使用card_faces
,當卡片有多個面時:
{
"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"
}
沒有card_faces
,當只有一張臉時(臉字段只是放在根中):
{
"object": "card",
"id": "some_id",
"lang": "en",
"released_at": "2012-02-03",
"name": "some_name",
"cost": "5",
"ctype": "some_type",
"colors": [
"R",
"B"
],
"set_code": "some_code"
}
我希望我的結構始終有一個Vec<CardFace>
字段。 就像是:
#[derive(Deserialize)]
struct Card {
object: String,
id: String,
lang: String,
released_at: String,
faces: Vec<CardFace>,
set_code: String,
}
是否可以反序列化這些對象並將面部字段強制轉換為所需的格式,或者我是否需要在反序列化之前操作 json?
我會使用中間enum
來做到這一點:
#[derive(Deserialize)]
#[serde(untagged)]
enum CardTmpDeser {
Card {
object: String,
id: String,
lang: String,
released_at: String,
card_faces: Vec<CardFace>,
set_code: String,
},
SingleCard {
object: String,
id: String,
lang: String,
released_at: String,
name: String,
cost: String,
ctype: String,
colors: Vec<String>,
set_code: String,
},
}
使用#[serde(untagged)]
屬性,您可以透明地反序列化您擁有的兩種數據。
現在只需用#[serde(from = "CardTmpDeser")]
標記您的實際結構:
#[derive(Debug, Deserialize)]
#[serde(from = "CardTmpDeser")]
pub struct Card {
object: String,
id: String,
lang: String,
released_at: String,
card_faces: Vec<CardFace>,
set_code: String,
}
並為Card
實現From<CardTmpDeser>
就可以了! serde
將使用CardTmpDeser
自動反序列化您的數據,但會透明地將其轉換為您的最終類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.