summaryrefslogtreecommitdiff
path: root/simplejson/encoder.py
diff options
context:
space:
mode:
authorScott Maxwell <scott@codecobblers.com>2012-03-01 23:25:25 -0800
committerScott Maxwell <scott@codecobblers.com>2012-03-01 23:25:25 -0800
commit08ef2e3e6e7da0fe9a5d2c73bbcc947489808579 (patch)
tree16ddea60cb8b87a297f5548731e94a6d180322de /simplejson/encoder.py
parent9069fbfe3d856e4b66b42c9a354423812e5a593b (diff)
downloadsimplejson-08ef2e3e6e7da0fe9a5d2c73bbcc947489808579.tar.gz
Added javascript_safe_ints support
Javascript cannot display integers of 2^54 or higher without loss of precision. This option will put numbers of 2^54 and higher or -2^54 and lower into quotes.
Diffstat (limited to 'simplejson/encoder.py')
-rw-r--r--simplejson/encoder.py19
1 files changed, 12 insertions, 7 deletions
diff --git a/simplejson/encoder.py b/simplejson/encoder.py
index 7f4f1cb..2ca80d0 100644
--- a/simplejson/encoder.py
+++ b/simplejson/encoder.py
@@ -107,7 +107,7 @@ class JSONEncoder(object):
check_circular=True, allow_nan=True, sort_keys=False,
indent=None, separators=None, encoding='utf-8', default=None,
use_decimal=True, namedtuple_as_object=True,
- tuple_as_array=True):
+ tuple_as_array=True, javascript_safe_ints=False):
"""Constructor for JSONEncoder, with sensible defaults.
If skipkeys is false, then it is a TypeError to attempt
@@ -160,6 +160,10 @@ class JSONEncoder(object):
If tuple_as_array is true (the default), tuple (and subclasses) will
be encoded as JSON arrays.
+
+ If javascript_safe_ints is true (not the default), ints 2**54 and higher
+ or -2**54 and lower will be encoded as strings. This is to avoid the
+ rounding that happens in Javascript otherwise.
"""
self.skipkeys = skipkeys
@@ -170,6 +174,7 @@ class JSONEncoder(object):
self.use_decimal = use_decimal
self.namedtuple_as_object = namedtuple_as_object
self.tuple_as_array = tuple_as_array
+ self.javascript_safe_ints = javascript_safe_ints
if indent is not None and not isinstance(indent, basestring):
indent = indent * ' '
self.indent = indent
@@ -285,13 +290,13 @@ class JSONEncoder(object):
markers, self.default, _encoder, self.indent,
self.key_separator, self.item_separator, self.sort_keys,
self.skipkeys, self.allow_nan, key_memo, self.use_decimal,
- self.namedtuple_as_object, self.tuple_as_array)
+ self.namedtuple_as_object, self.tuple_as_array, self.javascript_safe_ints)
else:
_iterencode = _make_iterencode(
markers, self.default, _encoder, self.indent, floatstr,
self.key_separator, self.item_separator, self.sort_keys,
self.skipkeys, _one_shot, self.use_decimal,
- self.namedtuple_as_object, self.tuple_as_array)
+ self.namedtuple_as_object, self.tuple_as_array, self.javascript_safe_ints)
try:
return _iterencode(o, 0)
finally:
@@ -327,7 +332,7 @@ class JSONEncoderForHTML(JSONEncoder):
def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
_key_separator, _item_separator, _sort_keys, _skipkeys, _one_shot,
- _use_decimal, _namedtuple_as_object, _tuple_as_array,
+ _use_decimal, _namedtuple_as_object, _tuple_as_array, _javascript_safe_ints,
## HACK: hand-optimized bytecode; turn globals into locals
False=False,
True=True,
@@ -378,7 +383,7 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
elif value is False:
yield buf + 'false'
elif isinstance(value, (int, long)):
- yield buf + str(value)
+ yield buf + str(value) if not _javascript_safe_ints or -2**54<value<2**54 else buf + '"' + str(value) + '"'
elif isinstance(value, float):
yield buf + _floatstr(value)
elif _use_decimal and isinstance(value, Decimal):
@@ -465,7 +470,7 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
elif value is False:
yield 'false'
elif isinstance(value, (int, long)):
- yield str(value)
+ yield str(value) if not _javascript_safe_ints or -2**54<value<2**54 else '"' + str(value) + '"'
elif isinstance(value, float):
yield _floatstr(value)
elif _use_decimal and isinstance(value, Decimal):
@@ -503,7 +508,7 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
elif o is False:
yield 'false'
elif isinstance(o, (int, long)):
- yield str(o)
+ yield str(o) if not _javascript_safe_ints or -2**54<value<2**54 else '"' + str(o) + '"'
elif isinstance(o, float):
yield _floatstr(o)
elif isinstance(o, list):