作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在将数据解析为:
struct Data {
field1: Option<f32>,
field2: Option<u64>,
// more ...
}
问题是我的输入数据格式格式化了 None
在 Rust 中为“n/a
”。
如何告诉 Serde Option<T>
应该是 None
对于特定字符串 n/a
,而不是错误?我们可以假设这不适用于 String
.
这与 How to deserialize "NaN" as `nan` with serde_json? 不是同一个问题因为那正在创建一个 f32
来自特殊值,而我的问题是创建一个 Option<Anything>
从一个特殊的值(value)。它也不是 How to transform fields during deserialization using Serde?因为这仍然涉及特定类型。
最佳答案
您可以编写自己的反序列化函数来处理这种情况:
use serde::de::Deserializer;
use serde::Deserialize;
// custom deserializer function
fn deserialize_maybe_nan<'de, D, T: Deserialize<'de>>(
deserializer: D,
) -> Result<Option<T>, D::Error>
where
D: Deserializer<'de>,
{
// we define a local enum type inside of the function
// because it is untagged, serde will deserialize as the first variant
// that it can
#[derive(Deserialize)]
#[serde(untagged)]
enum MaybeNA<U> {
// if it can be parsed as Option<T>, it will be
Value(Option<U>),
// otherwise try parsing as a string
NAString(String),
}
// deserialize into local enum
let value: MaybeNA<T> = Deserialize::deserialize(deserializer)?;
match value {
// if parsed as T or None, return that
MaybeNA::Value(value) => Ok(value),
// otherwise, if value is string an "n/a", return None
// (and fail if it is any other string)
MaybeNA::NAString(string) => {
if string == "n/a" {
Ok(None)
} else {
Err(serde::de::Error::custom("Unexpected string"))
}
}
}
}
然后您可以使用 #[serde(default, deserialize_with = "deserialize_maybe_nan")]
标记您的字段以使用此函数而不是默认函数:
#[derive(Deserialize)]
struct Data {
#[serde(default, deserialize_with = "deserialize_maybe_nan")]
field1: Option<f32>,
#[serde(default, deserialize_with = "deserialize_maybe_nan")]
field2: Option<u64>,
// more ...
}
文档中的更多信息:
关于rust - 使用 Serde 反序列化时,如何将特殊值转换为 Option::None?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56384447/
我是一名优秀的程序员,十分优秀!