web-dev-qa-db-ja.com

Rust&Serde JSON逆シリアル化の例?

Serdeを使用してJSONを構造体に逆シリアル化する方法を理解しようとしています。たとえば、serde_jsonの 独自のドキュメント のJSONの例には、次のデータが含まれています。

{
    "FirstName": "John",
    "LastName": "Doe",
    "Age": 43,
    "Address": {
        "Street": "Downing Street 10",
        "City": "London",
        "Country": "Great Britain"
    },
    "PhoneNumbers": [
        "+44 1234567",
        "+44 2345678"
    ]
}

ここで、上記のデータが変数「入力」と次のコードにあると仮定すると、次のようになります。

let deserialized_data: Data = serde_json::from_str(input).unwrap();

... struct Dataはどのように見えるべきですか?

16
vegai

ほとんどの標準データ構造はシリアライズ可能であるため、次の構造が機能するはずです。

#[derive(Serialize, Deserialize)]
struct Data {
    FirstName: String,
    LastName: String,
    Age: u32,
    Address: Address,
    PhoneNumbers: Vec<String>
}

#[derive(Serialize, Deserialize)]
struct Address {
    Street: String,
    City: String,
    Country: String
}

入力のフィールドの一部が欠落している可能性がある場合、対応する構造フィールドはTだけでなくOption<T>である必要があります。

Serdeは注釈の名前変更をサポートしているため、フィールドにもっと「さびた」方法で名前を付けることができることに注意してください。つまり、snake_caseです。

#[derive(Serialize, Deserialize)]
struct Address {
    #[serde(rename="Street")]
    street: String,
    #[serde(rename="City")]
    city: String,
    #[serde(rename="Country")]
    country: String
}

This 問題は、フィールドの名前変更にも関連しています。

19