Unable to propagate current deserialization options in custom deserializer
Closed this issue · 2 comments
Hi there,
thank you for TypedJSON I really love this project.
Yet, as far as I understand, we are missing the ability to propagate current deserialization option/context when using a custom deserializer.
For example :
I use jsonArrayMember annotation on a type and register a custom deserializer function.
When starting deserializing I register some ITypedJSONSettings for the TypedJSON instance (knownTypes, nameResolver, typeResolver).
When calling the custom deserializer function only the objectMemberValue json is passed as argument (line 300) :
https://github.com/JohnWeisz/TypedJSON/blob/master/src/deserializer.ts
In the custom deserializer I want to delegate further/simpler deserialization steps to the same/previous TypedJSON instance.
Even if I wanted to create a new instance I still miss the current configuration/options.
I know I can use static/global configuration but I can have multiple configurations at runtime.
I propose to pass 'this' as second argument for the deserializer function :
if (objMemberMetadata.deserializer != null) { revivedValue = objMemberMetadata.deserializer(objMemberValue, this); }
Also I want to change the deserializer signature (JsonMemberMetadata) :
deserializer?: ((json: any, current: Deserializer) => any) | null;
I can make a pull request if you do understand/agree what I do mean.
Also this should also be done for custom serializers.
For now, I resort switching global configuration at runtime but that's really ugly.
Please let me know me as soon as possibile.
Hi @amoscatelli, thanks for feedback. I read you issue before, but it slipped my mind to write a reply, sorry about that.
A PR would be great! One small comment, instead of passing TypedJSON internals to the function we should have a proxy function that hides it from a user. Also, instead of passing this directly I would prefer it to be passed inside an object so that the arg list does not grow indefinitely.