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/