我想使用自己的反序列化器对来自Serde的Rocket的传入数据进行反序列化。 tags
字段最初是一个字符串,应反序列化为Vec<String>
。字符串的格式是用逗号分隔的值,其中有些字符经过特殊处理。
对于我来说,Serde的文档完全不清楚。我刚刚从documentation复制了tags_deserialize
的基本结构。
当前我的代码如下:
#[derive(Deserialize)]
#[serde(deny_unknown_fields)]
pub struct TaskDataJson {
pub name: String,
pub description: String,
#[serde(deserialize_with = "tags_deserialize")]
pub tags: Vec<String>
}
fn tags_deserialize<'de, D>(deserializer: D) -> Result<Vec<String>, D::Error>
where
D: Deserializer<'de>,
{
??? - How do I access the string coming from the response and how do I set it??
}
传入数据的示例是:
{
"name":"name_sample",
"description":"description_sample",
"tags":"tag1,tag2,tag5"
}
这应该导致:
name = "name_sample";
description = "description_sample"
tags = ["tag1", "tag2", "tag5"]
答案 0 :(得分:0)
一种解决方法是将字符串序列“ tag1,tag2,tag3”反序列化为String
值,然后将其转换为字符串Vec
,例如:
fn tags_deserialize<'de, D>(deserializer: D) -> Result<Vec<String>, D::Error>
where
D: Deserializer<'de>,
{
let str_sequence = String::deserialize(deserializer)?;
Ok(str_sequence
.split(',')
.map(|item| item.to_owned())
.collect())
}