#duration #deserialize #chrono #serde-json #ext #features #seconds

serde-duration-ext

Serde support for std::time::Duration and chrono::Duration (chrono feature)

1 unstable release

0.1.0 Feb 9, 2024

#677 in Encoding

Download history 4/week @ 2024-02-13 32/week @ 2024-02-20 27/week @ 2024-02-27 5/week @ 2024-03-05 68/week @ 2024-03-12 1/week @ 2024-03-26 13/week @ 2024-04-02

86 downloads per month

Custom license

19KB
364 lines

Serde support for Duration and chrono::Duration

Installation

Add the following to your Cargo.toml:

[dependencies]
serde_duration_ext = "0.1.0"

Also you can enable the chrono feature to support chrono::Duration

[dependencies]
serde_duration_ext = { version = "0.1.0", features = ["chrono"] }

Usage

use serde::{Serialize, Deserialize};
use serde_json;

#[derive(Serialize, Deserialize, Debug, PartialEq)]
struct Foo {
    #[serde(with = "serde_duration_ext")]
    duration: std::time::Duration,
}

fn main() {
    let foo = Foo {
        duration: std::time::Duration::from_secs(123),
    };
    let json = serde_json::to_string(&foo).unwrap();
    assert_eq!(json, r#"{"duration":"123s"}"#);

    let foo2: Foo = serde_json::from_str(&json).unwrap();
    assert_eq!(foo, foo2);
}

You can also use chrono::Duration if you enable the chrono feature.

use serde::{Serialize, Deserialize};
use serde_json;

#[derive(Serialize, Deserialize, Debug, PartialEq)]
struct Foo {
    #[serde(with = "serde_duration_ext::chrono")]
    duration: chrono::Duration,
}

fn main() {
    let foo = Foo {
        duration: chrono::Duration::seconds(123),
    };
    let json = serde_json::to_string(&foo).unwrap();
    assert_eq!(json, r#"{"duration":"123s"}"#);

    let foo2: Foo = serde_json::from_str(&json).unwrap();
    assert_eq!(foo, foo2);
}

Library also provides useful types such as DurationUnit and TimeUnit

use serde::{Serialize, Deserialize};
use serde_json;

use serde_duration_ext::DurationUnit;

#[derive(Serialize, Deserialize, Debug, PartialEq)]
struct Foo {
    duration: DurationUnit,
}

fn main() {
    let foo = Foo {
        duration: DurationUnit::from_secs(123),
    };
    let json = serde_json::to_string(&foo).unwrap();
    assert_eq!(json, r#"{"duration":"123s"}"#);

    let foo2: Foo = serde_json::from_str(&json).unwrap();
    assert_eq!(foo, foo2);
}

Dependencies

~2.2–3.5MB
~65K SLoC