如何将以逗号分隔的JSON字符串反序列化为单独字符串的向量?

时间:2019-01-02 12:16:08

标签: json rust serde

我想使用自己的反序列化器对来自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"]

1 个答案:

答案 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())
}