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

标签 json rust serde

我想用我自己的反序列化器对一个字段从 Rocket 和 Serde 传入的数据进行反序列化。 tags字段本来是一个字符串,应该反序列化为 Vec<String> 。字符串的格式或多或少是逗号分隔的值,并对某些字符进行了特殊处理。

Serde 的文档对我来说完全不清楚如何处理这种情况。 tags_deserialize的基本结构我刚刚从 documentation 复制过来.

目前我的代码如下:

#[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"]

最佳答案

解决方法是将字符串序列“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())
}

关于json - 如何将逗号分隔的 JSON 字符串反序列化为单独字符串的向量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54006221/

相关文章:

rust - 版本 = "2018"使用或不使用 `extern crate <name>`

python json dict迭代{key : value} are the same

javascript - 从外部静态 JSON 文件检索数据并在 AWS Lambda 中使用

vector - 函数如何将值附加到向量并返回该值?

io - 如何跟踪使用 'std::io::Write' 时写入的字节数?

Rust 堆栈大小

rust - 使用公共(public)命名空间 quick_xml::se 时出错

rust - CSV from_writer 在 stdout() 上工作,但在 from_path 上失败

javascript - 如何根据公共(public)键值减少对象数组?

javascript - 使用 knockout 的 "placeholder” 属性 - JSON