3个版本
0.1.2 | 2024年7月8日 |
---|---|
0.1.1 | 2024年7月4日 |
0.1.0 | 2024年7月3日 |
在编码类别中排名第871
每月下载量495次
17KB
228 行
Serde Duplicate Deserialization Helper Crate
描述
一个Rust包,包含辅助宏,提供对serde的Deserialize的替代实现,适用于源数据中存在重复值的情况。
lib.rs
:
Serde Deserialize Duplicates Macros
此包提供了一些针对特定目的的实用工具:在serde中频繁使用重复键的情况下进行数据反序列化。它提供了两个辅助宏 - [DeserializeFirstDuplicate]和[DeserializeLastDuplicate],允许选择顺序。
使用此包
匹配重复名称
例如,以下JSON:
{
"myNumber": 34,
"myNumber": 67
}
根据JSON规范,这是一个有效的JSON数据。
有时我们会与不在我们控制之下的API进行交互,这些API可能会返回这样的数据,我们只关心我们有一个值,并且不会在运行时崩溃。
对于以下结构,如果上述数据被反序列化,由于重复键,将发生运行时崩溃。
use serde::{Serialize, Deserialize};
#[derive(Serialize, Deserialize)]
struct MyStruct {
#[serde(rename = "myNumber")]
my_number: i32
}
因此,此包提供了对Deserialize的替代方案,如下所示:
use serde::Serialize;
use serde_deserialize_duplicates::DeserializeFirstDuplicate;
#[derive(Serialize, DeserializeFirstDuplicate)]
struct MyStruct {
#[serde(rename = "myNumber")]
my_number: i32
}
现在,通过将Deserialize替换为该包的[DeserializeFirstDuplicate],我们可以简单地使用遇到的第一个"my_number",并忽略其余的。如果您正在寻找最后一个值,请参阅[DeserializeLastDuplicate]。
别名重复名称
此包还支持在存在别名值重叠解释的情况下进行反序列化。
例如,考虑以下JSON:
{
"breed": "Labarador",
"type": "Labarador"
}
有时我们有两个字段在JSON中存在,它们提供相同的信息,并且我们只想在获取一个的情况下反序列化其中一个。
这可以如下实现:
use serde::Serialize;
use serde_deserialize_duplicates::DeserializeLastDuplicate;
#[derive(Serialize, DeserializeLastDuplicate)]
struct Dog {
#[serde(alias = "type")]
breed: String
}
默认回退值
偶尔,我们可能希望加载可能存在或不存在的数据,并且可能同时是重复的。
Serde的default
属性支持此目的,既可以成功反序列化,也可以使用回退默认值。
use serde::Serialize;
use serde_deserialize_duplicates::DeserializeLastDuplicate;
#[derive(Serialize, DeserializeLastDuplicate)]
struct Dog {
#[serde(default)]
occurs_more_than_once: Option<String>
}
依赖关系
~0.4–1MB
~22K SLoC