diff options
author | Scott Maxwell <scott@codecobblers.com> | 2012-03-01 23:25:25 -0800 |
---|---|---|
committer | Scott Maxwell <scott@codecobblers.com> | 2012-03-01 23:25:25 -0800 |
commit | 08ef2e3e6e7da0fe9a5d2c73bbcc947489808579 (patch) | |
tree | 16ddea60cb8b87a297f5548731e94a6d180322de /simplejson/encoder.py | |
parent | 9069fbfe3d856e4b66b42c9a354423812e5a593b (diff) | |
download | simplejson-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.py | 19 |
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): |