gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:41:24 25 4
gpt4 key购买 nike

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

{
“foo”: “bar”,
“speech”: “something”
}

或者
{
“foo”: “bar”,
“speech”: [“something”, “something else”]
}

或者
{
“foo”: “bar”,
}

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

我可以使用以下方法处理反序列化字符串/字符串数组:
#[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 选项类型下无法正常使用。有人可以建议最简单,最简单的方法来实现此方法(serde可能非常复杂,我见过一些疯狂的东西:))?

最佳答案

尝试对speech字段使用Enum类型:

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

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

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

关于rust - 如何在Rust(使用serde)中反序列化可选的json参数,该参数可以是字符串或字符串数​​组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62031397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com