Я новичок в Rust и пытаюсь десериализовать данные JSON с помощью библиотеки serde. У меня следующая структура JSON:
{
“foo”: “bar”,
“speech”: “something”
}
или
{
“foo”: “bar”,
“speech”: [“something”, “something else”]
}
или
{
“foo”: “bar”,
}
Т.е. речь не является обязательной и может быть строкой или массивом строк.
Я могу обрабатывать десериализацию строки / массива строк, используя следующий подход:
#[derive(Debug, Serialize, Deserialize)]
struct foo {
pub foo: String,
#[serde(deserialize_with = "deserialize_message_speech")]
speech: Vec<String>
}
Я также могу обрабатывать десериализацию необязательного атрибута строки / массива строк, используя подход:
#[derive(Debug, Serialize, Deserialize)]
struct foo {
pub foo: String,
#[serde(skip_serializing_if = "Option::is_none")]
speech: Option<Vec<String>>
}
или
struct foo {
pub foo: String,
#[serde(skip_serializing_if = "Option::is_none")]
speech: Option<String>
}
Но объединить все вместе просто не получится. Кажется, что deserialize_with не работает должным образом с типом Option . Может ли кто-нибудь посоветовать самый простой и тривиальный способ реализовать это (serde может быть довольно сложным, я видел некоторые сумасшедшие вещи :))?