У меня есть случай, когда мне нужно выполнить некоторые преобразования типов на входящем JSON. Разные клиенты отправляют практически одни и те же данные разных типов:
{"amount": 49.90}
{"amount": "49.90"}
Моя структура и обработчик:
struct Amount {
pub amount: f64,
}
pub async fn amount(
amount: ValidatedJson<Amount>
) -> Result<HttpResponse, AppError> {
let amount: Amount = amount.to_inner();
...
}
Когда я пытаюсь выполнить JSON для структуры при сериализации возникает ошибка десериализации.
Я пытался сериализовать необработанное тело с помощью serde_ json, но не понял, как правильно выполнять проверки существования и обработку ошибок, поэтому я застрял с:
let body: String = String::from_utf8(bytes.to_vec()).map_err(|e| {
// logs
})?;
let body: Value = serde_json::from_str(body.as_str()).map_err(|e| {
// logs
})?;
let body = body.as_object().unwrap();
let amount: f32 = body.get("amount")?.as_f64()?;
Это можно сделать только ночью, используя try_trait
. Я думаю, это довольно глупый способ.
Какие у меня есть варианты? Я использую Rust 1.43 и actix-web 2.0.0.