#deserialize-json #json #deserialize #serialization #merde #jiter

merde_json_types

为 merde_json 实现序列化和反序列化的包装类型

7 个稳定版本

新版本 2.2.2 2024 年 8 月 16 日
2.1.2 2024 年 8 月 16 日
2.1.1 2024 年 7 月 31 日
2.0.0 2024 年 7 月 31 日

901编码 中排名

Download history 285/week @ 2024-07-27 22/week @ 2024-08-03 211/week @ 2024-08-10

每月下载量 518

Apache-2.0 OR MIT

26KB
463

license: MIT/Apache-2.0 crates.io docs.rs

merde_json_types

The merde_json logo: a glorious poop floating above a pair of hands

标志由 Misiasart 设计

merde_json_typesmerde_json 的配套 crate,提供了解决两个问题的包装类型。

问题 1:大多数 crate 中的类型没有实现 merde_json 特性

time cratechrono cratecamino 等为例。

如果你在你的某个结构体中有一个 time::OffsetDateTime,那么 merde_json 的 derive 宏将无法工作。你需要某种类型的包装,这正是这个 crate 提供的类型。

如果你启用了 time-serializetime-deserializemerde_json 功能,你可以这样做

use merde_json::{from_str, JsonSerialize, ToRustValue};
use merde_json_types::time::Rfc3339;

let dt = Rfc3339(time::OffsetDateTime::now_utc());
let serialized = dt.to_json_string();
let deserialized: Rfc3339<time::OffsetDateTime> =
    merde_json::from_str(&serialized).unwrap().to_rust_value().unwrap();
assert_eq!(dt, deserialized);

问题 2:保持 merde_json 可选

time::Rfc3339 类型在启用 time-types 功能时由本 crate 导出。但除非你激活其 merde_json 功能,否则 merde_json_types 不会依赖 merde_json(或提供序列化和反序列化实现)!

这意味着,你可以无条件地依赖 merde_json_types,并在你的公共结构体中使用 Rfc3339

use merde_json::{Fantome, JsonSerialize, ToRustValue};
use merde_json_types::time::Rfc3339;

#[derive(Debug, PartialEq, Eq)]
pub struct Person<'src, 'val> {
    pub name: String,
    pub birth_date: Rfc3339<time::OffsetDateTime>,

    pub _boo: Fantome<'src, 'val>,
}

merde_json::derive! {
    impl (JsonSerialize, JsonDeserialize) for Person { name, birth_date }
}

并且仍然只在你的 自己的 功能激活时依赖 merde_json

[dependencies]
merde_json_types = "2"
merde_json = { version = "2", optional = true }

[features]
merde_json = ["dep:merde_json", "merde_json_types/merde_json"]

当然,为了实现这一点,我们需要从我们的代码中去除对 merde_json 的任何无条件提及,这将变成类似于以下的内容

use std::marker::PhantomData;
use merde_json_types::time::Rfc3339;

#[derive(Debug, PartialEq, Eq)]
pub struct Person<'src, 'val> {
    pub name: String,
    pub birth_date: Rfc3339<time::OffsetDateTime>,

    /// This field still _has_ to be named `_boo`, but we can't use
    /// the `Fantome` type here without pulling in `merde_json`: so,
    /// we use `PhantomData` instead.
    pub _boo: PhantomData<(&'src (), &'val ())>,
}

#[cfg(feature = "merde_json")]
merde_json::derive! {
    impl (JsonSerialize, JsonDeserialize) for Person { name, birth_date }
}

依赖关系

~0–0.8MB
~16K SLoC