我是 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}\nRun 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}\nRun Code Online (Sandbox Code Playgroud)\n\n或者
\n\n{\n \xe2\x80\x9cfoo\xe2\x80\x9d: \xe2\x80\x9cbar\xe2\x80\x9d,\n}\nRun 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}\nRun 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}\nRun Code Online (Sandbox Code Playgroud)\n\n或者
\n\nstruct foo {\n pub foo: String,\n #[serde(skip_serializing_if = "Option::is_none")]\n speech: Option<String>\n}\nRun Code Online (Sandbox Code Playgroud)\n\n但将它们结合在一起根本行不通。看来deserialize_with不能与Option类型正常工作。有人可以建议最简单和最简单的方法来实现这个(serde 可能非常复杂,我见过一些疯狂的东西:))?
\nPie*_*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 。