#duplicate #serde #json #overlapping #multiple

serde-deserialize-duplicates

一个Rust包,包含辅助宏,提供对serde的Deserialize的替代实现,适用于源数据中存在重复值的情况

3个版本

0.1.2 2024年7月8日
0.1.1 2024年7月4日
0.1.0 2024年7月3日

编码类别中排名第871

Download history 251/week @ 2024-07-01 133/week @ 2024-07-08 62/week @ 2024-07-15 49/week @ 2024-07-22

每月下载量495

MIT/Apache

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