2015-10-21 16 views
10

私はSerdeを使用してJSONを構造体に逆シリアル化する方法を理解しようとしています。例えば、serde_jsonのown documentation上の例JSONには、以下のデータが含まれています。今Rust&Serde 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(); 

...構造体はどうすればDataのように見えますか?

答えて

12

標準的なデータ構造のほとんどは直列化可能なので、以下の構造が動作するはずです:

#[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 
} 

入力のフィールドの一部が存在しなくてもよい場合、対応する構造体フィールドがOption<T>だけではなく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問題もリネーム分野に関連しています。

+1

これを文書化するためのプルリクエスト:https://github.com/serde-rs/json/pull/15 – vegai

関連する問題