我正在尝试编写一个自定义Deserialize实现,它可以对我的枚举执行不区分大小写的反序列化:
use serde::{Deserialize, Deserializer}; // 1.0.120
use serde_json; // 1.0.61
#[derive(Debug, PartialEq)]
enum MyEnum {
Foo,
Bar,
}
// Implements case-insensitive deserialization of node types using from_str above
impl<'de> Deserialize<'de> for MyEnum {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let v = String::deserialize(deserializer)?;
match v.to_ascii_lowercase().as_ref() {
"foo" => Ok(MyEnum::Foo),
"bar" => Ok(MyEnum::Bar),
_ => Err(serde::de::Error::custom("invalid value")),
}
}
}
Run Code Online (Sandbox Code Playgroud)
这有效,但会导致两种分配:一种是将输入值放入 a 中String,另一种是将其转换String为大写。我不需要第一个,因为 serde 提供了Deserialize for &str. 我怎么称呼它?
这不起作用:
let v: &str = &str::deserialize(deserializer)?
Run Code Online (Sandbox Code Playgroud)
因为:
error[E0277]: the trait bound `str: Deserialize<'_>` is not satisfied
--> src/lib.rs:16:24
|
16 | let v: &str = &str::deserialize(deserializer)?;
| ^^^^^^^^^^^^^^^^ the trait `Deserialize<'_>` is not implemented for `str`
|
::: /playground/.cargo/registry/src/github.com-1ecc6299db9ec823/serde-1.0.120/src/de/mod.rs:540:12
|
540 | D: Deserializer<'de>;
| ----------------- required by this bound in `serde::Deserialize::deserialize`
|
= help: the following implementations were found:
<&'a str as Deserialize<'de>>
Run Code Online (Sandbox Code Playgroud)
(除了关于 str 大小的其他错误未知)。
它甚至告诉我有一个实现&'a str,但我不确定使用什么语法来调用它。
harmic 通过输出类型提供了“调度”,只要结果消除歧义,您就可以在特征本身上调用该方法。
或者,您可以使用“turbofish”来强制进行类型评估:正如错误告诉您的那样,&str::deserialize(deserializer)?实际上解析为&(str::deserialize(deserializer)?). <&str>::deserialize(deserializer)?将强制调用发生&str,并避免显式键入结果的需要。
| 归档时间: |
|
| 查看次数: |
87 次 |
| 最近记录: |