I'm writing code to receive an arbitrary object (possibly nested) capable of being converted to JSON.
The default behavior for Python's builtin JSON encoder is to convert NaNs to NaN
, e.g. json.dumps(np.NaN)
results in NaN
. How can I change this NaN
value to null
?
I tried to subclass JSONEncoder
and override the default()
method as follows:
from json import JSONEncoder, dumps import numpy as np class NanConverter(JSONEncoder): def default(self, obj): try: _ = iter(obj) except TypeError: if isinstance(obj, float) and np.isnan(obj): return "null" return JSONEncoder.default(self, obj) >>> d = {'a': 1, 'b': 2, 'c': 3, 'e': np.nan, 'f': [1, np.nan, 3]} >>> dumps(d, cls=NanConverter) '{"a": 1, "c": 3, "b": 2, "e": NaN, "f": [1, NaN, 3]}'
EXPECTED RESULT: '{"a": 1, "c": 3, "b": 2, "e": null, "f": [1, null, 3]}'
NaN isn't valid JSON (https://tools.ietf.org/html/rfc8259 sec 6) and should probably be changed to null.
The json. dumps() method allows us to convert a python object into an equivalent JSON object. Or in other words to send the data from python to json. The json. dump() method allows us to convert a python object into an equivalent JSON object and store the result into a JSON file at the working directory.
A fp is a file pointer used to write JSON formatted data into file. Python json module always produces string objects, not bytes objects, therefore, fp.
json loads -> returns an object from a string representing a json object. json dumps -> returns a string representing a json object from an object. load and dump -> read/write from/to file instead of string.
This seems to achieve my objective:
import simplejson >>> simplejson.dumps(d, ignore_nan=True) Out[3]: '{"a": 1, "c": 3, "b": 2, "e": null, "f": [1, null, 3]}'
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With