如何在 Rust 中反序列化(使用 serde)可选 json 参数,可以是字符串或字符串数​​组

Ada*_*cny 6 rust serde

我是 Rust 新手,我正在尝试使用 serde 库反序列化 JSON 数据。\n我有以下 JSON 结构:

\n\n
{\n    \xe2\x80\x9cfoo\xe2\x80\x9d: \xe2\x80\x9cbar\xe2\x80\x9d,\n    \xe2\x80\x9cspeech\xe2\x80\x9d: \xe2\x80\x9csomething\xe2\x80\x9d\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者

\n\n
{\n    \xe2\x80\x9cfoo\xe2\x80\x9d: \xe2\x80\x9cbar\xe2\x80\x9d,\n    \xe2\x80\x9cspeech\xe2\x80\x9d: [\xe2\x80\x9csomething\xe2\x80\x9d, \xe2\x80\x9csomething else\xe2\x80\x9d]\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者

\n\n
{\n    \xe2\x80\x9cfoo\xe2\x80\x9d: \xe2\x80\x9cbar\xe2\x80\x9d,\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

语音是可选的,它可以是字符串或字符串数​​组。

\n\n

我可以使用以下方法处理反序列化字符串/字符串数组:

\n\n
#[derive(Debug, Serialize, Deserialize)]\n   struct foo {\n   pub foo: String,\n   #[serde(deserialize_with = "deserialize_message_speech")]\n   speech: Vec<String>\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我还可以使用以下方法处理反序列化可选字符串/字符串数组属性:

\n\n
#[derive(Debug, Serialize, Deserialize)]\nstruct foo {\n   pub foo: String,\n   #[serde(skip_serializing_if = "Option::is_none")]\n   speech: Option<Vec<String>>\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者

\n\n
struct foo {\n   pub foo: String,\n   #[serde(skip_serializing_if = "Option::is_none")]\n   speech: Option<String>\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

但将它们结合在一起根本行不通。看来deserialize_with不能与Option类型正常工作。有人可以建议最简单和最简单的方法来实现这个(serde 可能非常复杂,我见过一些疯狂的东西:))?

\n

Pie*_*Pah 10

尝试对字段使用枚举类型speech

#[derive(Serialize, Deserialize)]
#[serde(untagged)]
enum Speech {
    Str(String),
    StrArray(Vec<String>),   
}

#[derive(Debug, Serialize, Deserialize)]
   struct foo {
   pub foo: String,
   speech: Option<Speech>,
}
Run Code Online (Sandbox Code Playgroud)

枚举是 Rust 中表示变体类型的首选方法。有关更多详细信息,请参阅https://serde.rs/enum-representations.html 。