Примеры десериализации Rust и Serde JSON?

Я пытаюсь понять, как десериализовать JSON в структуру с помощью Serde. Например, пример JSON в собственной документации serde_json содержит следующее данные:

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

Теперь, если мы предположим, что приведенные выше данные находятся в переменной "input" и в следующем фрагменте кода:

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

... как должна выглядеть структура Data?


person vegai    schedule 21.10.2015    source источник


Ответы (1)


Большинство стандартных структур данных сериализуемы, поэтому следующие структуры должны работать:

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

Обратите внимание, что можно называть поля более "ржавыми" способами, например snake_case, потому что serde поддерживает переименование аннотаций:

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

Эта проблема также относится к переименованию полей.

person Vladimir Matveev    schedule 21.10.2015