I think a more practical and compatible approach is to keep json as it is, and use a side channel (e.g. an openapi spec) to convey metadata.
Then it is up to the client to decide that a date returned as a string is a date or string, or to create a specific class instead of a generic object