簡體   English   中英

Rust Serde - 是否可以將可能在兩種不同布局中的 json 數據映射回單個結構?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM