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 在 编码 中排名
每月下载量 518
26KB
463 行
merde_json_types
标志由 Misiasart 设计
merde_json_types
是 merde_json 的配套 crate,提供了解决两个问题的包装类型。
问题 1:大多数 crate 中的类型没有实现 merde_json
特性
以 time crate、chrono crate、camino 等为例。
如果你在你的某个结构体中有一个 time::OffsetDateTime
,那么 merde_json 的 derive 宏将无法工作。你需要某种类型的包装,这正是这个 crate 提供的类型。
如果你启用了 time-serialize
、time-deserialize
和 merde_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