将 serde::Serialize 与 Option<chrono::DateTime> 一起使用
Using `serde::Serialize` with `Option<chrono::DateTime>`
尝试序列化时 Option<chrono::DateTime<Utc>>
我遇到错误:
error[E0308]: mismatched types
--> src/main.rs:39:14
|
39 | #[derive(Serialize, Debug)]
| ^^^^^^^^^ expected struct `DateTime`, found enum `std::option::Option`
|
= note: expected reference `&DateTime<Utc>`
found reference `&'__a std::option::Option<DateTime<Utc>>`
= note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info)
代码(Playground):
use chrono::{serde::ts_seconds, DateTime, NaiveDate, Utc};
use serde::Serialize;
fn main() {
let test_struct = TestStruct {
a: 2.45,
date: Some(DateTime::from_utc(
NaiveDate::from_ymd(2000, 1, 1).and_hms(1, 1, 1),
Utc,
)),
};
let string = serde_json::to_string(&test_struct).unwrap();
println!("default: {}", string);
#[derive(Serialize, Debug)]
struct TestStruct {
pub a: f32,
#[serde(with = "ts_seconds")]
pub date: Option<DateTime<Utc>>,
}
}
看着chrono::ts_seconds
and serde_with我不知道该往哪里前进。
我将非常感谢对此的任何帮助。
您可以编写自己的包装器并将其与 serialize_with
and skip_serializing_if
:
pub fn serialize_dt<S>(
dt: &Option<DateTime<Utc>>,
serializer: S
) -> Result<S::Ok, S::Error>
where
S: Serializer {
match dt {
Some(dt) => ts_seconds::serialize(dt, serializer),
_ => unreachable!(),
}
}
#[derive(Serialize, Debug)]
struct TestStruct {
pub a: f32,
#[serde(serialize_with = "serialize_dt", skip_serializing_if = "Option::is_none")]
pub date: Option<DateTime<Utc>>,
}
Chrono 已经有 Option<DateTime<Utc>>
的功能,即 chrono::serde::ts_seconds_option
。
#[derive(Serialize, Debug)]
struct TestStruct {
pub a: f32,
#[serde(with = "ts_seconds_option")]
pub date: Option<DateTime<Utc>>,
}
serde_with
的解决方案如下所示:
#[serde_as]
#[derive(Serialize, Debug)]
struct TestStruct {
pub a: f32,
#[serde_as(as = "Option<DurationSeconds<i64>>")]
pub date: Option<DateTime<Utc>>,
}
尝试序列化时 Option<chrono::DateTime<Utc>>
我遇到错误:
error[E0308]: mismatched types
--> src/main.rs:39:14
|
39 | #[derive(Serialize, Debug)]
| ^^^^^^^^^ expected struct `DateTime`, found enum `std::option::Option`
|
= note: expected reference `&DateTime<Utc>`
found reference `&'__a std::option::Option<DateTime<Utc>>`
= note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info)
代码(Playground):
use chrono::{serde::ts_seconds, DateTime, NaiveDate, Utc};
use serde::Serialize;
fn main() {
let test_struct = TestStruct {
a: 2.45,
date: Some(DateTime::from_utc(
NaiveDate::from_ymd(2000, 1, 1).and_hms(1, 1, 1),
Utc,
)),
};
let string = serde_json::to_string(&test_struct).unwrap();
println!("default: {}", string);
#[derive(Serialize, Debug)]
struct TestStruct {
pub a: f32,
#[serde(with = "ts_seconds")]
pub date: Option<DateTime<Utc>>,
}
}
看着chrono::ts_seconds
and serde_with我不知道该往哪里前进。
我将非常感谢对此的任何帮助。
您可以编写自己的包装器并将其与 serialize_with
and skip_serializing_if
:
pub fn serialize_dt<S>(
dt: &Option<DateTime<Utc>>,
serializer: S
) -> Result<S::Ok, S::Error>
where
S: Serializer {
match dt {
Some(dt) => ts_seconds::serialize(dt, serializer),
_ => unreachable!(),
}
}
#[derive(Serialize, Debug)]
struct TestStruct {
pub a: f32,
#[serde(serialize_with = "serialize_dt", skip_serializing_if = "Option::is_none")]
pub date: Option<DateTime<Utc>>,
}
Chrono 已经有 Option<DateTime<Utc>>
的功能,即 chrono::serde::ts_seconds_option
。
#[derive(Serialize, Debug)]
struct TestStruct {
pub a: f32,
#[serde(with = "ts_seconds_option")]
pub date: Option<DateTime<Utc>>,
}
serde_with
的解决方案如下所示:
#[serde_as]
#[derive(Serialize, Debug)]
struct TestStruct {
pub a: f32,
#[serde_as(as = "Option<DurationSeconds<i64>>")]
pub date: Option<DateTime<Utc>>,
}