This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: Python JSON module doesn't actually produce JSON
Type: Stage: resolved
Components: Library (Lib) Versions: Python 3.6, Python 3.5
process
Status: closed Resolution: not a bug
Dependencies: Superseder:
Assigned To: Nosy List: Connor.Wolf, ezio.melotti
Priority: normal Keywords:

Created on 2016-01-13 23:15 by Connor.Wolf, last changed 2022-04-11 14:58 by admin. This issue is now closed.

Messages (3)
msg258179 - (view) Author: Connor Wolf (Connor.Wolf) Date: 2016-01-13 23:15
The Python library JSON library doesn't emit JSON by default.

Basically, `json.dumps(float('nan'))` produces something that kind of looks like json, but isn't (specifically, `'NaN'`). Valid JSON must be `null`.

JSON *does not allow `NaN`, `infinity`, or `-infinity`. 

`json.dump[s]` has the parameter `allow_nan`, but it's `False` by default, so basically it's not actually JSON by default.

The default for emitting JSON should actually emit JSON. `allow_nan` must be `True` by default.
msg258181 - (view) Author: Ezio Melotti (ezio.melotti) * (Python committer) Date: 2016-01-13 23:19
This is documented at https://docs.python.org/3/library/json.html#standard-compliance-and-interoperability and https://docs.python.org/3/library/json.html#infinite-and-nan-number-values
The default could be changed if we go through a deprecation process, but I'm not sure it's worth it.
msg258183 - (view) Author: Connor Wolf (Connor.Wolf) Date: 2016-01-13 23:40
The problem here is that JSON is *everywhere*, and I only ran into this particular issue after a whole bunch of digging as to why my "JSON" messages were disappearing in some javascript. 

Basically, with the default the way it is, you have interoperability bombs in every project that uses it to interface with other languages. In my case, I'm using Flask-SocketIO ( https://github.com/miguelgrinberg/Flask-SocketIO ), which uses JSON as it's transport, and it works fine until you have a NaN or infinity in your data, at which point the socket.io in the browser starts *silently* eating messages.

Basically, if I call json.dumps, the principle of least astonishment dictated that you actually get, you know, JSON.

If you have a module called something like `pyson`, and it's partially JSON compatible, that makes sense. For the JSON module to fail at the very thing it's named after is kind of ludicrous.
History
Date User Action Args
2022-04-11 14:58:26adminsetgithub: 70293
2016-01-13 23:40:34Connor.Wolfsetmessages: + msg258183
2016-01-13 23:19:58ezio.melottisetstatus: open -> closed

versions: + Python 3.5, Python 3.6, - Python 3.4
nosy: + ezio.melotti

messages: + msg258181
resolution: not a bug
stage: resolved
2016-01-13 23:15:13Connor.Wolfcreate