import json
class FloatEncoder(json.JSONEncoder):
def __init__(self, nan_str = "null", **kwargs):
super(FloatEncoder,self).__init__(**kwargs)
self.nan_str = nan_str
#uses code from official python json.encoder module. Same licence applies.
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)
example_obj = {'name': 'example', 'body': [1.1, {"3.3": 5, "1.1": float('Nan')}, [float('inf'), 2.2]]}
print json.dumps(example_obj, cls=FloatEncoder)
aW1wb3J0IGpzb24KCmNsYXNzIEZsb2F0RW5jb2Rlcihqc29uLkpTT05FbmNvZGVyKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFuX3N0ciA9ICJudWxsIiwgKiprd2FyZ3MpOgogICAgICAgIHN1cGVyKEZsb2F0RW5jb2RlcixzZWxmKS5fX2luaXRfXygqKmt3YXJncykKCXNlbGYubmFuX3N0ciA9IG5hbl9zdHIKCiAgICAjdXNlcyBjb2RlIGZyb20gb2ZmaWNpYWwgcHl0aG9uIGpzb24uZW5jb2RlciBtb2R1bGUuIFNhbWUgbGljZW5jZSBhcHBsaWVzLgogICAgZGVmIGl0ZXJlbmNvZGUoc2VsZiwgbywgX29uZV9zaG90PUZhbHNlKToKICAgICAgICAiIiJFbmNvZGUgdGhlIGdpdmVuIG9iamVjdCBhbmQgeWllbGQgZWFjaCBzdHJpbmcKICAgICAgICByZXByZXNlbnRhdGlvbiBhcyBhdmFpbGFibGUuCgogICAgICAgIEZvciBleGFtcGxlOjoKCiAgICAgICAgICAgIGZvciBjaHVuayBpbiBKU09ORW5jb2RlcigpLml0ZXJlbmNvZGUoYmlnb2JqZWN0KToKICAgICAgICAgICAgICAgIG15c29ja2V0LndyaXRlKGNodW5rKQoKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLmNoZWNrX2NpcmN1bGFyOgogICAgICAgICAgICBtYXJrZXJzID0ge30KICAgICAgICBlbHNlOgogICAgICAgICAgICBtYXJrZXJzID0gTm9uZQogICAgICAgIGlmIHNlbGYuZW5zdXJlX2FzY2lpOgogICAgICAgICAgICBfZW5jb2RlciA9IGpzb24uZW5jb2Rlci5lbmNvZGVfYmFzZXN0cmluZ19hc2NpaQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIF9lbmNvZGVyID0ganNvbi5lbmNvZGVyLmVuY29kZV9iYXNlc3RyaW5nCiAgICAgICAgaWYgc2VsZi5lbmNvZGluZyAhPSAndXRmLTgnOgogICAgICAgICAgICBkZWYgX2VuY29kZXIobywgX29yaWdfZW5jb2Rlcj1fZW5jb2RlciwgX2VuY29kaW5nPXNlbGYuZW5jb2RpbmcpOgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvLCBzdHIpOgogICAgICAgICAgICAgICAgICAgIG8gPSBvLmRlY29kZShfZW5jb2RpbmcpCiAgICAgICAgICAgICAgICByZXR1cm4gX29yaWdfZW5jb2RlcihvKQoKICAgICAgICBkZWYgZmxvYXRzdHIobywgYWxsb3dfbmFuPXNlbGYuYWxsb3dfbmFuLAogICAgICAgICAgICAgICAgX3JlcHI9anNvbi5lbmNvZGVyLkZMT0FUX1JFUFIsIF9pbmY9anNvbi5lbmNvZGVyLklORklOSVRZLCBfbmVnaW5mPS1qc29uLmVuY29kZXIuSU5GSU5JVFksIG5hbl9zdHIgPSBzZWxmLm5hbl9zdHIpOgogICAgICAgICAgICAjIENoZWNrIGZvciBzcGVjaWFscy4gIE5vdGUgdGhhdCB0aGlzIHR5cGUgb2YgdGVzdCBpcyBwcm9jZXNzb3IKICAgICAgICAgICAgIyBhbmQvb3IgcGxhdGZvcm0tc3BlY2lmaWMsIHNvIGRvIHRlc3RzIHdoaWNoIGRvbid0IGRlcGVuZCBvbiB0aGUKICAgICAgICAgICAgIyBpbnRlcm5hbHMuCgogICAgICAgICAgICBpZiBvICE9IG86CiAgICAgICAgICAgICAgICB0ZXh0ID0gbmFuX3N0cgogICAgICAgICAgICBlbGlmIG8gPT0gX2luZjoKICAgICAgICAgICAgICAgIHRleHQgPSAnSW5maW5pdHknCiAgICAgICAgICAgIGVsaWYgbyA9PSBfbmVnaW5mOgogICAgICAgICAgICAgICAgdGV4dCA9ICctSW5maW5pdHknCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gX3JlcHIobykKCiAgICAgICAgICAgIGlmIG5vdCBhbGxvd19uYW46CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgICAgICJPdXQgb2YgcmFuZ2UgZmxvYXQgdmFsdWVzIGFyZSBub3QgSlNPTiBjb21wbGlhbnQ6ICIgKwogICAgICAgICAgICAgICAgICAgIHJlcHIobykpCgogICAgICAgICAgICByZXR1cm4gdGV4dAoKICAgICAgICBfaXRlcmVuY29kZSA9IGpzb24uZW5jb2Rlci5fbWFrZV9pdGVyZW5jb2RlKAogICAgICAgICAgICAgICAgbWFya2Vycywgc2VsZi5kZWZhdWx0LCBfZW5jb2Rlciwgc2VsZi5pbmRlbnQsIGZsb2F0c3RyLAogICAgICAgICAgICAgICAgc2VsZi5rZXlfc2VwYXJhdG9yLCBzZWxmLml0ZW1fc2VwYXJhdG9yLCBzZWxmLnNvcnRfa2V5cywKICAgICAgICAgICAgICAgIHNlbGYuc2tpcGtleXMsIF9vbmVfc2hvdCkKICAgICAgICByZXR1cm4gX2l0ZXJlbmNvZGUobywgMCkKCgpleGFtcGxlX29iaiA9ICB7J25hbWUnOiAnZXhhbXBsZScsICdib2R5JzogWzEuMSwgeyIzLjMiOiA1LCAiMS4xIjogZmxvYXQoJ05hbicpfSwgW2Zsb2F0KCdpbmYnKSwgMi4yXV19CnByaW50IGpzb24uZHVtcHMoZXhhbXBsZV9vYmosIGNscz1GbG9hdEVuY29kZXIp