Releases: jonasbb/serde_with
serde_with v2.3.0
Added
-
Add
serde_as
compatible versions for the existing duplicate key and value handling. (#534)
The new typesMapPreventDuplicates
,MapFirstKeyWins
,SetPreventDuplicates
, andSetLastValueWins
can replace the existing modulesmaps_duplicate_key_is_error
,maps_first_key_wins
,sets_duplicate_value_is_error
, andsets_last_value_wins
. -
Added a new
KeyValueMap
type using the map key as a struct field. (#341)
This conversion is useful for maps, where an ID value is the map key, but the ID should become part of a single struct.
The conversion allows this, by using a special field named$key$
.This conversion is possible for structs and maps, using the
$key$
field.
Tuples, tuple structs, and sequences are supported by turning the first value into the map key.Each of the
SimpleStruct
s// Somewhere there is a collection: // #[serde_as(as = "KeyValueMap<_>")] // Vec<SimpleStruct>, #[derive(Serialize, Deserialize)] struct SimpleStruct { b: bool, // The field named `$key$` will become the map key #[serde(rename = "$key$")] id: String, i: i32, }
will turn into a JSON snippet like this.
"id-0000": { "b": false, "i": 123 },
Changed
- Relax the trait bounds of
Seq
to allow for more custom types. (#565)
This extends the support beyond tuples.
Fixed
EnumMap
passes thehuman_readable
status of theSerializer
to more places.- Support
alloc
on targets withouttarget_has_atomic = "ptr"
. (#560)
Thanks to @vembacher for reporting and fixing the issue.
serde_with v2.2.0
Added
-
Add new
Map
andSeq
types for converting between maps and tuple lists. (#527)The behavior is not new, but already present using
BTreeMap
/HashMap
orVec
.
However, the new typesMap
andSeq
are also available onno_std
, even without thealloc
feature.
Changed
- Pin the
serde_with_macros
dependency to the same version as the main crate.
This simplifies publishing and ensures that always a compatible version is picked.
Fixed
serde_with::apply
had an issue matching types when invisible token groups where in use (#538)
The token groups can stem from macro_rules expansion, but should be treated mostly transparent.
The old code required a group to match a group, while now groups are silently removed when checking for type patterns.
serde_with v2.1.0
Added
-
Add new
apply
attribute 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
apply
attribute 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 likeOption
to match anyOption
be itOption<String>
,Option<bool>
, orOption<T>
.
Fixed
serde_with_macros v2.1.0
Added
-
Add new
apply
attribute 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
apply
attribute 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 likeOption
to match anyOption
be itOption<String>
,Option<bool>
, orOption<T>
.
Fixed
serde_with v2.0.1
Added
time
added support for the well-knownIso8601
format.
This extends the existing support ofRfc2822
andRfc3339
.
Changed
- Warn if
serde_as
is 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_as
is 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_as
definitions.
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
Option
field and transformation are detected by directly matching on the type name.
These variants are detected asOption
.Option
std::option::Option
, with or without leading::
core::option::Option
, with or without leading::
If an existing
default
attribute 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)]
. -
NoneAsEmptyString
andstring_empty_as_none
use 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 theFromStr
bound.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_as
based conversions are preferred.-
seq_display_fromstr
: UseDisplayFromStr
in 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
: UseBTreeMap
on aVec
of tuples:#[serde_as(as = "BTreeMap<_, _>")] // HashMap will also work s: Vec<(i32, String)>,
-
map_as_tuple_list
can be replaced with#[serde_as(as = "Vec<(_, _)>")]
. -
display_fromstr
can be replaced with#[serde_as(as = "DisplayFromStr")]
. -
bytes_or_string
can be replaced with#[serde_as(as = "BytesOrString")]
. -
default_on_error
can be replaced with#[serde_as(as = "DefaultOnError")]
. -
default_on_null
can be replaced with#[serde_as(as = "DefaultOnNull")]
. -
string_empty_as_none
can be replaced with#[serde_as(as = "NoneAsEmptyString")]
. -
StringWithSeparator
can now only be used inserde_as
.
The definition of theSeparator
trait and its implementations have been moved to theformats
module. -
json::nested
can be replaced with#[serde_as(as = "json::JsonString")]
.
-
-
Remove previously deprecated modules.
sets_first_value_wins
btreemap_as_tuple_list
andhashmap_as_tuple_list
can 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
Option
field and transformation are detected by directly matching on the type name.
These variants are detected asOption
.Option
std::option::Option
, with or without leading::
core::option::Option
, with or without leading::
If an existing
default
attribute 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
Option
field and transformation are detected by directly matching on the type name.
These variants are detected asOption
.Option
std::option::Option
, with or without leading::
core::option::Option
, with or without leading::
If an existing
default
attribute 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)]
. -
NoneAsEmptyString
andstring_empty_as_none
use 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 theFromStr
bound.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_as
based conversions are preferred.-
seq_display_fromstr
: UseDisplayFromStr
in 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
: UseBTreeMap
on aVec
of tuples:#[serde_as(as = "BTreeMap<_, _>")] // HashMap will also work s: Vec<(i32, String)>,
-
map_as_tuple_list
can be replaced with#[serde_as(as = "Vec<(_, _)>")]
. -
display_fromstr
can be replaced with#[serde_as(as = "DisplayFromStr")]
. -
bytes_or_string
can be replaced with#[serde_as(as = "BytesOrString")]
. -
default_on_error
can be replaced with#[serde_as(as = "DefaultOnError")]
. -
default_on_null
can be replaced with#[serde_as(as = "DefaultOnNull")]
. -
string_empty_as_none
can be replaced with#[serde_as(as = "NoneAsEmptyString")]
. -
StringWithSeparator
can now only be used inserde_as
.
The definition of theSeparator
trait and its implementations have been moved to theformats
module. -
json::nested
can be replaced with#[serde_as(as = "json::JsonString")]
.
-
-
Remove previously deprecated modules.
sets_first_value_wins
btreemap_as_tuple_list
andhashmap_as_tuple_list
can 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
Option
field and transformation are detected by directly matching on the type name.
These variants are detected asOption
.Option
std::option::Option
, with or without leading::
core::option::Option
, with or without leading::
If an existing
default
attribute 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)]
.