rust - 如何将字符串解析为与第 3 方板条箱中的类型不匹配的大小写?

所以这是来自第 3 方库的一些代码:

#[derive(Debug, PartialEq, Eq, Hash, Clone, Serialize, Deserialize, Copy, Ord, PartialOrd)]
pub enum ViewingMetric {
    RatingPercentage,
    Rating
}

我想要的是解析像“rating_percentage”这样的字符串,而不能将 #[serde(rename_all = "...")] 添加到第 3 方代码中。我可以在调用 serde_json::from_str 期间以某种方式指定重命名吗?或者我必须添加另一个处理外壳之间转换的第 3 方库吗?

回答1

有一个关于https://serde.rs/remote-derive.html的指南,您可以在其中自定义您需要的任何内容:

会是这样的:

#[derive(Serialize, Deserialize)]
#[serde(remote = "OtherCrate::ViewingMetric", rename_all = "snake_case")]
enum ViwingMetricSerde {
    RatingPercentage,
    Rating
}

重要的是,您必须从新类型实现 From/Into 到远程类型 From<ViwingMetricSerde> for ViwingMetric

然后从您的代码中,实际获取原始类型:

#[derive(Serialize, Deserialize)]
pub struct MyStruct {
    #[serde(with = "ViwingMetricSerde")]
    metric: ViwingMetris
}