Releases: jonasbb/serde_with
serde_with v2.1.0
Added
-
Add new
applyattribute to simplify repetitive attributes over many fields.
Multiple rules and multiple attributes can be provided each.#[serde_with::apply( Option => #[serde(default)] #[serde(skip_serializing_if = "Option::is_none")], Option<bool> => #[serde(rename = "bool")], )] #[derive(serde::Serialize)] struct Data { a: Option<String>, b: Option<u64>, c: Option<String>, d: Option<bool>, }
The
applyattribute will expand into this, applying the attributs to the matching fields:#[derive(serde::Serialize)] struct Data { #[serde(default)] #[serde(skip_serializing_if = "Option::is_none")] a: Option<String>, #[serde(default)] #[serde(skip_serializing_if = "Option::is_none")] b: Option<u64>, #[serde(default)] #[serde(skip_serializing_if = "Option::is_none")] c: Option<String>, #[serde(default)] #[serde(skip_serializing_if = "Option::is_none")] #[serde(rename = "bool")] d: Option<bool>, }
The attribute supports field matching using many rules, such as
_to apply to all fields and partial generics likeOptionto match anyOptionbe itOption<String>,Option<bool>, orOption<T>.
Fixed
serde_with_macros v2.1.0
Added
-
Add new
applyattribute to simplify repetitive attributes over many fields.
Multiple rules and multiple attributes can be provided each.#[serde_with::apply( Option => #[serde(default)] #[serde(skip_serializing_if = "Option::is_none")], Option<bool> => #[serde(rename = "bool")], )] #[derive(serde::Serialize)] struct Data { a: Option<String>, b: Option<u64>, c: Option<String>, d: Option<bool>, }
The
applyattribute will expand into this, applying the attributs to the matching fields:#[derive(serde::Serialize)] struct Data { #[serde(default)] #[serde(skip_serializing_if = "Option::is_none")] a: Option<String>, #[serde(default)] #[serde(skip_serializing_if = "Option::is_none")] b: Option<u64>, #[serde(default)] #[serde(skip_serializing_if = "Option::is_none")] c: Option<String>, #[serde(default)] #[serde(skip_serializing_if = "Option::is_none")] #[serde(rename = "bool")] d: Option<bool>, }
The attribute supports field matching using many rules, such as
_to apply to all fields and partial generics likeOptionto match anyOptionbe itOption<String>,Option<bool>, orOption<T>.
Fixed
serde_with v2.0.1
Added
timeadded support for the well-knownIso8601format.
This extends the existing support ofRfc2822andRfc3339.
Changed
- Warn if
serde_asis used on an enum variant.
Attributes on enum variants were never supported.
But#[serde(with = "...")]can be added on variants, such that some confusion can occur when migration (#499).
Note
A cargo bug (cargo#10801) means that upgrading from v1 to v2 may add unnecessary crates to the Cargo.lock file.
A diff of the lock-file makes it seem that serde_with depends on new crates, even though these crates are unused and will not get compiled or linked.
However, tools consuming Cargo.lock or cargo metadata might give wrong results.
serde_with_macros v2.0.1
Changed
- Warn if
serde_asis used on an enum variant.
Attributes on enum variants were never supported.
But#[serde(with = "...")]can be added on variants, such that some confusion can occur when migration (#499).
serde_with v2.0.0
Added
-
Make
JsonString<T>smarter by allowing nestingserde_asdefinitions.
This allows applying custom serialization logic, before the value gets converted into a JSON string.// Rust #[serde_as(as = "JsonString<Vec<(JsonString, _)>>")] value: BTreeMap<[u8; 2], u32>, // JSON {"value":"[[\"[1,2]\",3],[\"[4,5]\",6]]"}
Changed
-
Make
#[serde_as]behave more intuitive onOption<T>fields.The
#[serde_as]macro now detects if a#[serde_as(as = "Option<S>")]is used on a field of typeOption<T>and applies#[serde(default)]to the field.
This restores the ability to deserialize with missing fields and fixes a common annoyance (#183, #185, #311, #417).
This is a breaking change, since now deserialization will pass where it did not before and this might be undesired.The
Optionfield and transformation are detected by directly matching on the type name.
These variants are detected asOption.Optionstd::option::Option, with or without leading::core::option::Option, with or without leading::
If an existing
defaultattribute is detected, the attribute is not applied again.
This behavior can be suppressed by using#[serde_as(no_default)]or#[serde_as(as = "Option<S>", no_default)]. -
NoneAsEmptyStringandstring_empty_as_noneuse a different serialization bound (#388).Both types used
AsRef<str>as the serialization bound.
This is limiting for non-string types likeOption<i32>.
The deserialization often was already more flexible, due to theFromStrbound.For most std types this should have little impact, as the types implementing
AsRef<str>mostly implementDisplay, too, such asString,Cow<str>, orRc<str>. -
Bump MSRV to 1.60. This is required for the optional dependency feature syntax in cargo.
Removed
-
Remove old module based conversions.
The newer
serde_asbased conversions are preferred.-
seq_display_fromstr: UseDisplayFromStrin combination with your container type:#[serde_as(as = "BTreeSet<DisplayFromStr>")] addresses: BTreeSet<Ipv4Addr>, #[serde_as(as = "Vec<DisplayFromStr>")] bools: Vec<bool>,
-
tuple_list_as_map: UseBTreeMapon aVecof tuples:#[serde_as(as = "BTreeMap<_, _>")] // HashMap will also work s: Vec<(i32, String)>,
-
map_as_tuple_listcan be replaced with#[serde_as(as = "Vec<(_, _)>")]. -
display_fromstrcan be replaced with#[serde_as(as = "DisplayFromStr")]. -
bytes_or_stringcan be replaced with#[serde_as(as = "BytesOrString")]. -
default_on_errorcan be replaced with#[serde_as(as = "DefaultOnError")]. -
default_on_nullcan be replaced with#[serde_as(as = "DefaultOnNull")]. -
string_empty_as_nonecan be replaced with#[serde_as(as = "NoneAsEmptyString")]. -
StringWithSeparatorcan now only be used inserde_as.
The definition of theSeparatortrait and its implementations have been moved to theformatsmodule. -
json::nestedcan be replaced with#[serde_as(as = "json::JsonString")].
-
-
Remove previously deprecated modules.
sets_first_value_winsbtreemap_as_tuple_listandhashmap_as_tuple_listcan be replaced with#[serde_as(as = "Vec<(_, _)>")].
serde_with_macros v2.0.0
No changes compared to v2.0.0-rc.0.
Changed
-
Make
#[serde_as]behave more intuitive onOption<T>fields.The
#[serde_as]macro now detects if a#[serde_as(as = "Option<S>")]is used on a field of typeOption<T>and applies#[serde(default)]to the field.
This restores the ability to deserialize with missing fields and fixes a common annoyance (#183, #185, #311, #417).
This is a breaking change, since now deserialization will pass where it did not before and this might be undesired.The
Optionfield and transformation are detected by directly matching on the type name.
These variants are detected asOption.Optionstd::option::Option, with or without leading::core::option::Option, with or without leading::
If an existing
defaultattribute is detected, the attribute is not applied again.
This behavior can be supressed by using#[serde_as(no_default)]or#[serde_as(as = "Option<S>", no_default)].
Fixed
- Make the documentation clearer by stating that the
#[serde_as]and#[skip_serializing_none]attributes must always be placed before#[derive].
serde_with v2.0.0-rc.0
Changed
-
Make
#[serde_as]behave more intuitive onOption<T>fields.The
#[serde_as]macro now detects if a#[serde_as(as = "Option<S>")]is used on a field of typeOption<T>and applies#[serde(default)]to the field.
This restores the ability to deserialize with missing fields and fixes a common annoyance (#183, #185, #311, #417).
This is a breaking change, since now deserialization will pass where it did not before and this might be undesired.The
Optionfield and transformation are detected by directly matching on the type name.
These variants are detected asOption.Optionstd::option::Option, with or without leading::core::option::Option, with or without leading::
If an existing
defaultattribute is detected, the attribute is not applied again.
This behavior can be suppressed by using#[serde_as(no_default)]or#[serde_as(as = "Option<S>", no_default)]. -
NoneAsEmptyStringandstring_empty_as_noneuse a different serialization bound (#388).Both types used
AsRef<str>as the serialization bound.
This is limiting for non-string types likeOption<i32>.
The deserialization often was already more flexible, due to theFromStrbound.For most std types this should have little impact, as the types implementing
AsRef<str>mostly implementDisplay, too, such asString,Cow<str>, orRc<str>. -
Bump MSRV to 1.60. This is required for the optional dependency feature syntax in cargo.
Removed
-
Remove old module based conversions.
The newer
serde_asbased conversions are preferred.-
seq_display_fromstr: UseDisplayFromStrin combination with your container type:#[serde_as(as = "BTreeSet<DisplayFromStr>")] addresses: BTreeSet<Ipv4Addr>, #[serde_as(as = "Vec<DisplayFromStr>")] bools: Vec<bool>,
-
tuple_list_as_map: UseBTreeMapon aVecof tuples:#[serde_as(as = "BTreeMap<_, _>")] // HashMap will also work s: Vec<(i32, String)>,
-
map_as_tuple_listcan be replaced with#[serde_as(as = "Vec<(_, _)>")]. -
display_fromstrcan be replaced with#[serde_as(as = "DisplayFromStr")]. -
bytes_or_stringcan be replaced with#[serde_as(as = "BytesOrString")]. -
default_on_errorcan be replaced with#[serde_as(as = "DefaultOnError")]. -
default_on_nullcan be replaced with#[serde_as(as = "DefaultOnNull")]. -
string_empty_as_nonecan be replaced with#[serde_as(as = "NoneAsEmptyString")]. -
StringWithSeparatorcan now only be used inserde_as.
The definition of theSeparatortrait and its implementations have been moved to theformatsmodule. -
json::nestedcan be replaced with#[serde_as(as = "json::JsonString")].
-
-
Remove previously deprecated modules.
sets_first_value_winsbtreemap_as_tuple_listandhashmap_as_tuple_listcan be replaced with#[serde_as(as = "Vec<(_, _)>")].
serde_with_macros v2.0.0-rc.0
Changed
-
Make
#[serde_as]behave more intuitive onOption<T>fields.The
#[serde_as]macro now detects if a#[serde_as(as = "Option<S>")]is used on a field of typeOption<T>and applies#[serde(default)]to the field.
This restores the ability to deserialize with missing fields and fixes a common annoyance (#183, #185, #311, #417).
This is a breaking change, since now deserialization will pass where it did not before and this might be undesired.The
Optionfield and transformation are detected by directly matching on the type name.
These variants are detected asOption.Optionstd::option::Option, with or without leading::core::option::Option, with or without leading::
If an existing
defaultattribute is detected, the attribute is not applied again.
This behavior can be suppressed by using#[serde_as(no_default)]or#[serde_as(as = "Option<S>", no_default)].
serde_with v1.14.0
Added
-
Add support for
timecrate v0.3 #450time::Durationcan now be serialized with theDurationSecondsand related converters.// Rust #[serde_as(as = "serde_with::DurationSeconds<u64>")] value: Duration, // JSON "value": 86400,
time::OffsetDateTimeandtime::PrimitiveDateTimecan now be serialized with theTimestampSecondsand related converters.// Rust #[serde_as(as = "serde_with::TimestampMicroSecondsWithFrac<String>")] value: time::PrimitiveDateTime, // JSON "value": "1000000",
time::OffsetDateTimecan be serialized in string format in different well-known formats.
Two formats are supported,time::format_description::well_known::Rfc2822andtime::format_description::well_known::Rfc3339.// Rust #[serde_as(as = "time::format_description::well_known::Rfc2822")] rfc_2822: OffsetDateTime, #[serde_as(as = "Vec<time::format_description::well_known::Rfc3339>")] rfc_3339: Vec<OffsetDateTime>, // JSON "rfc_2822": "Fri, 21 Nov 1997 09:55:06 -0600", "rfc_3339": ["1997-11-21T09:55:06-06:00"],
-
Deserialize
boolfrom integers #456 462Deserialize an integer and convert it into a
bool.
BoolFromInt<Strict>(default) deserializes 0 tofalseand1totrue, other numbers are errors.
BoolFromInt<Flexible>deserializes any non-zero astrue.
Serialization only emits 0/1.// Rust #[serde_as(as = "BoolFromInt")] // BoolFromInt<Strict> b: bool, // JSON "b": 1,
Changed
- Bump MSRV to 1.53, since the new dependency
timerequires that version.
Fixed
- Make the documentation clearer by stating that the
#[serde_as]and#[skip_serializing_none]attributes must always be places before#[derive].
serde_with v1.13.0
Added
-
Added support for
indexmap::IndexMapandindexmap::IndexSettypes. #431, #436Both types are now compatible with these functions:
maps_duplicate_key_is_error,maps_first_key_wins,sets_duplicate_value_is_error,sets_last_value_wins.
serde_asintegration is provided by implementing bothSerializeAsandDeserializeAsfor both types.
IndexMaps can also be serialized as a list of types via theserde_as(as = "Vec<(_, _)>")annotation.All implementations are gated behind the
indexmapfeature.Thanks to @jgrund for providing parts of the implementation.