Actix-web со слабым типом JSON в строго типизированную структуру - PullRequest
0 голосов
/ 17 июня 2020

У меня есть случай, когда мне нужно выполнить некоторые преобразования типов на входящем 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...