On Mon, Aug 12, 2019 at 10:09 AM David Shawley <daveshaw...@gmail.com> wrote:
>
> On Aug 8, 2019, at 3:55 PM, Chris Angelico <ros...@gmail.com> wrote:
> > 2) Should there be a protocol obj.__json__() to return a string
> > representation of an object for direct insertion into a JSON file?
>
> I'm inclined towards the protocol, since there are protocols for
> various other encoders (eg deepcopy, pickle), and it avoids the
> problem of json importing decimal. It can also be implemented entirely
> as a third-party patch, although you'd need to subclass Decimal to add
> that method.
>
> I proposed something similar about a year ago [1].  I really like the idea
> of a protocol for this.  Especially since the other encoders already use
> this approach.  Should I reboot this approach?  The implementation was
> really simple [2].
>
> [1]: 
> https://mail.python.org/archives/list/python-ideas@python.org/thread/ZC4OOAVDA5ZFNCSFKDNO7P3UUOXO3DCG/
> [2]: https://github.com/dave-shawley/cpython/pull/2

As proposed here, this is unable to solve the original problem,
because whatever's returned gets encoded (so if you return a string,
it will be represented as a string). It'd need to NOT re-encode it,
thus allowing an object to choose its own representation.

Minor bikeshedding: protocols like this are more usually dunders, so
__json__ or __jsonformat__ would be a better spelling. I'm going to
assume __json__ here, but other spellings are equally viable.

For the purposes of documentation, built-in types could be given
__json__ methods, though the optimization in the C version would mean
they're actually bypassed.

class int:
    def __json__(self): return str(self)

class float:
    def __json__(self):
        if math.isfinite(self): return str(self)
        return "null"

class Decimal:
    def __json__(self): return str(self)

It may be of value to pass the JSONEncoder instance (or a callback) to
this method, which would allow the object to say "render me the way
you would render this".

Thoughts?

ChrisA
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/WEJPC4SZSVNMVLWM5J5AIQRICRLXRSWU/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to