You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Support adding hooks for supported objects types #671
Right now, dec_hooks and enc_hooks are called only if msgspec encounters unknown type. I'd like a way to override dec/enc logic for specific supported types, but there is no way to do it rn. Possible solutions:
add new argument with Dict[Type[T], Callable[[T], Any] that works even if T is subclass of Struct or any other supported type
inspect argument type annotation for callables passed to dec_hooks and enc_hooks. If it is annotated with some type, use hook even if type supported natively
introduce special (possibly dunder method) that can override default enc/dec logic. It can look something like this in python: decoded = if hasattr(obj.__class__, "__decode__") obj.__decode__(obj) else <native logic>. This will only work for Struct subclasses though
Reacted by sennalen, Kevin Lee, Rose Davidson, Nuno Campos, 叶子, nockstarr, Dmitry, Mark, Jiří Kuneš, Niels Wouda and 3 more
we have the same problem.
msgspec json encoder supports a lot more types by default which sometimes isn't what we want(ex. sometimes we'd rather have serialization to fail rather than letting it pass and create an encoded data that we wouldn't know what type to decode it to by the time it gets to deserialization step).
and sometimes the way that msgspec json serializes certain supported types just isn't what we want.
both of these issues can be dealt with if there's a way to override behaviour for certain supported types.
Same problem here: I get timestamps in milliseconds and have to convert them.
As a workaround I currently define a new datetime subclass class Timestamp(datetime): ... and register a decoder hook for this Timestamp class. Works, but feels wrong.
I encountered this problem with subclasses of dict.
I'm using ICal Components from the icalendar package, and I would like to serialize them into strings with comp.to_ical(), but they inherit from dict, so msgspec completely ignores my enc_hook and serializes them as dicts.
That would have been acceptable if all information was saved in dict keys, but it's not, so for example sub-components are completely missing in the serialized data.
Activity
[-]Support adding hooks for supported objects[/-][+]Support adding hooks for supported objects types[/+]wikiped commentedon Apr 24, 2024
Linked: #669
kevin-lee-dialpad commentedon May 7, 2024
we have the same problem.
msgspec json encoder supports a lot more types by default which sometimes isn't what we want(ex. sometimes we'd rather have serialization to fail rather than letting it pass and create an encoded data that we wouldn't know what type to decode it to by the time it gets to deserialization step).
and sometimes the way that msgspec json serializes certain supported types just isn't what we want.
both of these issues can be dealt with if there's a way to override behaviour for certain supported types.
pohlt commentedon Apr 9, 2025
Same problem here: I get timestamps in milliseconds and have to convert them.
As a workaround I currently define a new
datetimesubclassclass Timestamp(datetime): ...and register a decoder hook for thisTimestampclass. Works, but feels wrong.kunesj commentedon Oct 17, 2025
I encountered this problem with subclasses of
dict.I'm using ICal Components from the icalendar package, and I would like to serialize them into strings with
comp.to_ical(), but they inherit fromdict, so msgspec completely ignores myenc_hookand serializes them as dicts.That would have been acceptable if all information was saved in dict keys, but it's not, so for example sub-components are completely missing in the serialized data.