2015-10-21 23 views
10

Próbuję dowiedzieć się, jak deserializować JSON w strukturę przy użyciu Serde. Na przykład, przykład JSON na serde_json na own documentation zawiera następujące dane:Przykłady deserializacji JSON Rust & Serde?

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

Teraz, jeśli założymy, że powyższe dane są w zmiennej „wejście” i następujący fragment kodu:

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

... jak powinien wyglądać struct Data?

Odpowiedz

12

Większość standardowych struktur danych są serializacji, więc następujące struktury powinny działać:

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

przypadku niektórych pól wejściowych może być nieobecny, a następnie w odpowiednich polach struktura powinna Option<T> zamiast tylko T .

Należy zauważyć, że możliwe jest, aby wymienić pól w bardziej „Rusty” sposób, tj snake_case, ponieważ serde obsługuje zmienianie nazw adnotacji:

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

This kwestią jest również istotne, aby zmiana nazwy pól.

+1

Wyciągnij wniosek, aby to udokumentować: https://github.com/serde-rs/json/pull/15 – vegai