2015-10-21 5 views
10

Ich versuche herauszufinden, wie JSON mit Serde in eine Struktur deserialisiert werden kann. Zum Beispiel JSON das Beispiel auf serde_json der own documentation enthält die folgenden Daten:Rust & Serde JSON Deserialisierung Beispiele?

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

Wenn wir nun, dass die oben genannten Daten übernehmen in einer Variablen „Eingang“ ist und das folgende Stück Code:

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

... wie sollte struct Data aussehen?

Antwort

12

Die meisten Standarddatenstrukturen sind serializable, so sollten die folgenden Strukturen arbeiten:

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

Wenn einige der Felder in der Eingabe fehlen kann, so sind die entsprechenden Strukturfelder sollten Option<T> statt nur T sein .

Beachten Sie, dass es möglich ist, Felder in einer „Rusty“ Art und Weise zu nennen, das heißt snake_case, weil serde Umbenennung Anmerkungen unterstützt:

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

This Problem ist auch relevant für Felder umbenennen.

+1

Anforderung ziehen, um dies zu dokumentieren: https://github.com/serde-rs/json/pull/15 – vegai