'JSON encoder with NaN and float inf support.
The sole purpose of defining a custom JSONEncoder class is to
override floatstr() inner function, or more specifically the
representation of NaN and +/-float(\'inf\') values in a JSON. Although
Infinity values are not supported by JSON standard, we still can
convince Javascript JSON.parse() to create a Javascript Infinity
object if we feed a token `1e+999` to it.'

def iterencode(self, o, _one_shot=False):

    if self.check_circular:
        markers = {}
    else:
        markers = None
    if self.ensure_ascii:
        _encoder = encoder.encode_basestring_ascii
    else:
        _encoder = encoder.encode_basestring
    if (six.PY2 and (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=float.__repr__, _inf=encoder.INFINITY, _neginf=(- encoder.INFINITY)):
        if (o != o):
            text = self.nan_str
        elif (o == _inf):
            text = self.inf_str
        elif (o == _neginf):
            text = ('-' + self.inf_str)
        else:
            return _repr(o)
        if (not allow_nan):
            raise ValueError((_('Out    of    range    float    values    are    not    JSON    compliant:    %r') % 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)
