【发布时间】:2021-05-14 00:47:09
【问题描述】:
我很难理解如何使用 Rust 的 serde 为自定义映射实现反序列化。如果有人能帮我做这个例子,我会很高兴:
我有以下结构:
#[derive(Debug, Clone, PartialEq)]
pub struct ConnectorTopics {
pub name: String,
pub topics: Vec<String>,
}
JSON 数据采用以下格式:
{
"test-name": {
"topics": [
"topic1",
"topic2"
]
}
}
如您所见,name 字段是主题的包装,因此在我的情况下,它应该反序列化为:
let _ = ConnectorTopics {
name: "test-name".into(),
topics: vec!["topic1".into(), "topic2".into()]
}
我的第一次尝试是在 Deserialize 实现中使用自定义结构,但是,这不会编译并且似乎不是正确的方法。
impl<'de> Deserialize<'de> for ConnectorTopics {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
#[derive(Debug, Deserialize)]
struct Inner {
topics: Vec<String>,
}
let a = deserializer.deserialize_map(HashMap<String, Inner>).unwrap();
let value = Deserialize::deserialize::<HashMap<String, Inner>>(deserializer)?;
let (connector, inner) = value.iter().nth(0).ok_or("invalid")?.0;
Ok(ConnectorTopics {
name: connector,
topics: vec![],
})
}
}
【问题讨论】:
-
那个奇怪的 json 模式
-
希望我能控制它。 :)