Skip to content

Instantly share code, notes, and snippets.

@pauloalem
Created August 15, 2013 21:14
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pauloalem/6244976 to your computer and use it in GitHub Desktop.
Save pauloalem/6244976 to your computer and use it in GitHub Desktop.
Custom python encoder for handling NaN, Infinity and -Infinity, which are non-valid JSON values and can possibly screw your json parser
import json
class FloatEncoder(json.JSONEncoder):
def __init__(self, nan_str="null", **kwargs):
super(FloatEncoder, self).__init__(**kwargs)
self.nan_str = nan_str
def iterencode(self, o, _one_shot=False):
"""Encode the given object and yield each string
representation as available.
For example::
for chunk in JSONEncoder().iterencode(bigobject):
mysocket.write(chunk)
"""
if self.check_circular:
markers = {}
else:
markers = None
if self.ensure_ascii:
_encoder = json.encoder.encode_basestring_ascii
else:
_encoder = json.encoder.encode_basestring
if self.encoding != 'utf-8':
def _encoder(o, _orig_encoder=_encoder, _encoding=self.encoding):
if isinstance(o, str):
o = o.decode(_encoding)
return _orig_encoder(o)
def floatstr(o, allow_nan=self.allow_nan, _repr=json.encoder.FLOAT_REPR,
_inf=json.encoder.INFINITY, _neginf=-json.encoder.INFINITY,
nan_str=self.nan_str):
# Check for specials. Note that this type of test is processor
# and/or platform-specific, so do tests which don't depend on the
# internals.
if o != o:
text = nan_str
elif o == _inf:
text = 'Infinity'
elif o == _neginf:
text = '-Infinity'
else:
return _repr(o)
if not allow_nan:
raise ValueError(
"Out of range float values are not JSON compliant: " +
repr(o))
return text
_iterencode = json.encoder._make_iterencode(
markers, self.default, _encoder, self.indent, floatstr,
self.key_separator, self.item_separator, self.sort_keys,
self.skipkeys, _one_shot)
return _iterencode(o, 0)
d = {"i_will_byte_you_in_the_ass": float("NaN")}
print json.dumps(d, cls=FloatEncoder)
@the21st
Copy link

the21st commented Dec 9, 2019

Thanks for this!

However, when I use this in Python 3.7, I get:

AttributeError: 'FloatEncoder' object has no attribute 'encoding'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment