Mercurial > cpython-lru_cache-weakref
annotate Lib/json/encoder.py @ 87690:66c1c9f32567 default tip
Add use_weakref option to functools.lru_cache
The use_weakref option makes lru_cache create weak references to the function
arguments when creating the cache key, which prevents them from staying in the
memory forever even after all other references to them are gone.
This is a proof of concept for http://bugs.python.org/issue19859
| author | Radomir Dopieralski <devel@sheep.art.pl> |
|---|---|
| date | Tue, 03 Dec 2013 16:02:48 +0100 |
| parents | ae1a7c420f08 |
| children |
| rev | line source |
|---|---|
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
1 """Implementation of JSONEncoder |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
2 """ |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
3 import re |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
4 |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
5 try: |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
6 from _json import encode_basestring_ascii as c_encode_basestring_ascii |
|
84442
7769c4d72806
Issue #18200: Back out usage of ModuleNotFoundError (8d28d44f3a9a)
Brett Cannon <brett@python.org>
parents:
84114
diff
changeset
|
7 except ImportError: |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
8 c_encode_basestring_ascii = None |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
9 try: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
10 from _json import make_encoder as c_make_encoder |
|
84442
7769c4d72806
Issue #18200: Back out usage of ModuleNotFoundError (8d28d44f3a9a)
Brett Cannon <brett@python.org>
parents:
84114
diff
changeset
|
11 except ImportError: |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
12 c_make_encoder = None |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
13 |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
14 ESCAPE = re.compile(r'[\x00-\x1f\\"\b\f\n\r\t]') |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
15 ESCAPE_ASCII = re.compile(r'([\\"]|[^\ -~])') |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
16 HAS_UTF8 = re.compile(b'[\x80-\xff]') |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
17 ESCAPE_DCT = { |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
18 '\\': '\\\\', |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
19 '"': '\\"', |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
20 '\b': '\\b', |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
21 '\f': '\\f', |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
22 '\n': '\\n', |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
23 '\r': '\\r', |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
24 '\t': '\\t', |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
25 } |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
26 for i in range(0x20): |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
27 ESCAPE_DCT.setdefault(chr(i), '\\u{0:04x}'.format(i)) |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
28 #ESCAPE_DCT.setdefault(chr(i), '\\u%04x' % (i,)) |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
29 |
|
77100
06f21c6e0f2b
#14875: Use float('inf') instead of float('1e66666') in the json module.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
69295
diff
changeset
|
30 INFINITY = float('inf') |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
31 FLOAT_REPR = repr |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
32 |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
33 def encode_basestring(s): |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
34 """Return a JSON representation of a Python string |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
35 |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
36 """ |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
37 def replace(match): |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
38 return ESCAPE_DCT[match.group(0)] |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
39 return '"' + ESCAPE.sub(replace, s) + '"' |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
40 |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
41 |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
42 def py_encode_basestring_ascii(s): |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
43 """Return an ASCII-only JSON representation of a Python string |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
44 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
45 """ |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
46 def replace(match): |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
47 s = match.group(0) |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
48 try: |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
49 return ESCAPE_DCT[s] |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
50 except KeyError: |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
51 n = ord(s) |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
52 if n < 0x10000: |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
53 return '\\u{0:04x}'.format(n) |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
54 #return '\\u%04x' % (n,) |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
55 else: |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
56 # surrogate pair |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
57 n -= 0x10000 |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
58 s1 = 0xd800 | ((n >> 10) & 0x3ff) |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
59 s2 = 0xdc00 | (n & 0x3ff) |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
60 return '\\u{0:04x}\\u{1:04x}'.format(s1, s2) |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
61 return '"' + ESCAPE_ASCII.sub(replace, s) + '"' |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
62 |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
63 |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
64 encode_basestring_ascii = ( |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
65 c_encode_basestring_ascii or py_encode_basestring_ascii) |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
66 |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
67 class JSONEncoder(object): |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
68 """Extensible JSON <http://json.org> encoder for Python data structures. |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
69 |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
70 Supports the following objects and types by default: |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
71 |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
72 +-------------------+---------------+ |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
73 | Python | JSON | |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
74 +===================+===============+ |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
75 | dict | object | |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
76 +-------------------+---------------+ |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
77 | list, tuple | array | |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
78 +-------------------+---------------+ |
|
63575
4874efd1f657
#9087: update json docstrings -- unicode and long do not exist anymore.
Georg Brandl <georg@python.org>
parents:
63273
diff
changeset
|
79 | str | string | |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
80 +-------------------+---------------+ |
|
63575
4874efd1f657
#9087: update json docstrings -- unicode and long do not exist anymore.
Georg Brandl <georg@python.org>
parents:
63273
diff
changeset
|
81 | int, float | number | |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
82 +-------------------+---------------+ |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
83 | True | true | |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
84 +-------------------+---------------+ |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
85 | False | false | |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
86 +-------------------+---------------+ |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
87 | None | null | |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
88 +-------------------+---------------+ |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
89 |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
90 To extend this to recognize other objects, subclass and implement a |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
91 ``.default()`` method with another method that returns a serializable |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
92 object for ``o`` if possible, otherwise it should call the superclass |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
93 implementation (to raise ``TypeError``). |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
94 |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
95 """ |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
96 item_separator = ', ' |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
97 key_separator = ': ' |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
98 def __init__(self, skipkeys=False, ensure_ascii=True, |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
99 check_circular=True, allow_nan=True, sort_keys=False, |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
100 indent=None, separators=None, default=None): |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
101 """Constructor for JSONEncoder, with sensible defaults. |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
102 |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
103 If skipkeys is false, then it is a TypeError to attempt |
|
63575
4874efd1f657
#9087: update json docstrings -- unicode and long do not exist anymore.
Georg Brandl <georg@python.org>
parents:
63273
diff
changeset
|
104 encoding of keys that are not str, int, float or None. If |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
105 skipkeys is True, such items are simply skipped. |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
106 |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
107 If ensure_ascii is true, the output is guaranteed to be str |
|
63575
4874efd1f657
#9087: update json docstrings -- unicode and long do not exist anymore.
Georg Brandl <georg@python.org>
parents:
63273
diff
changeset
|
108 objects with all incoming non-ASCII characters escaped. If |
|
4874efd1f657
#9087: update json docstrings -- unicode and long do not exist anymore.
Georg Brandl <georg@python.org>
parents:
63273
diff
changeset
|
109 ensure_ascii is false, the output can contain non-ASCII characters. |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
110 |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
111 If check_circular is true, then lists, dicts, and custom encoded |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
112 objects will be checked for circular references during encoding to |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
113 prevent an infinite recursion (which would cause an OverflowError). |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
114 Otherwise, no such check takes place. |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
115 |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
116 If allow_nan is true, then NaN, Infinity, and -Infinity will be |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
117 encoded as such. This behavior is not JSON specification compliant, |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
118 but is consistent with most JavaScript based encoders and decoders. |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
119 Otherwise, it will be a ValueError to encode such floats. |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
120 |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
121 If sort_keys is true, then the output of dictionaries will be |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
122 sorted by key; this is useful for regression tests to ensure |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
123 that JSON serializations can be compared on a day-to-day basis. |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
124 |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
125 If indent is a non-negative integer, then JSON array |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
126 elements and object members will be pretty-printed with that |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
127 indent level. An indent level of 0 will only insert newlines. |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
128 None is the most compact representation. |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
129 |
|
80631
e63ac05ccfa8
#16333: use (",", ": ") as default separator when indent is specified to avoid trailing whitespace. Patch by Serhiy Storchaka.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
80630
diff
changeset
|
130 If specified, separators should be an (item_separator, key_separator) |
|
e63ac05ccfa8
#16333: use (",", ": ") as default separator when indent is specified to avoid trailing whitespace. Patch by Serhiy Storchaka.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
80630
diff
changeset
|
131 tuple. The default is (', ', ': ') if *indent* is ``None`` and |
|
e63ac05ccfa8
#16333: use (",", ": ") as default separator when indent is specified to avoid trailing whitespace. Patch by Serhiy Storchaka.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
80630
diff
changeset
|
132 (',', ': ') otherwise. To get the most compact JSON representation, |
|
e63ac05ccfa8
#16333: use (",", ": ") as default separator when indent is specified to avoid trailing whitespace. Patch by Serhiy Storchaka.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
80630
diff
changeset
|
133 you should specify (',', ':') to eliminate whitespace. |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
134 |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
135 If specified, default is a function that gets called for objects |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
136 that can't otherwise be serialized. It should return a JSON encodable |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
137 version of the object or raise a ``TypeError``. |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
138 |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
139 """ |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
140 |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
141 self.skipkeys = skipkeys |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
142 self.ensure_ascii = ensure_ascii |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
143 self.check_circular = check_circular |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
144 self.allow_nan = allow_nan |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
145 self.sort_keys = sort_keys |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
146 self.indent = indent |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
147 if separators is not None: |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
148 self.item_separator, self.key_separator = separators |
|
80631
e63ac05ccfa8
#16333: use (",", ": ") as default separator when indent is specified to avoid trailing whitespace. Patch by Serhiy Storchaka.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
80630
diff
changeset
|
149 elif indent is not None: |
|
e63ac05ccfa8
#16333: use (",", ": ") as default separator when indent is specified to avoid trailing whitespace. Patch by Serhiy Storchaka.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
80630
diff
changeset
|
150 self.item_separator = ',' |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
151 if default is not None: |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
152 self.default = default |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
153 |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
154 def default(self, o): |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
155 """Implement this method in a subclass such that it returns |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
156 a serializable object for ``o``, or calls the base implementation |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
157 (to raise a ``TypeError``). |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
158 |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
159 For example, to support arbitrary iterators, you could |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
160 implement default like this:: |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
161 |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
162 def default(self, o): |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
163 try: |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
164 iterable = iter(o) |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
165 except TypeError: |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
166 pass |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
167 else: |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
168 return list(iterable) |
|
82721
5d56e1214e95
#16057: Clarify why the base method default is called in custom encoders.
R David Murray <rdmurray@bitdance.com>
parents:
80628
diff
changeset
|
169 # Let the base class default method raise the TypeError |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
170 return JSONEncoder.default(self, o) |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
171 |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
172 """ |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
173 raise TypeError(repr(o) + " is not JSON serializable") |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
174 |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
175 def encode(self, o): |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
176 """Return a JSON string representation of a Python data structure. |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
177 |
|
85103
ae1a7c420f08
Close #18264: int- and float-derived enums now converted to int or float.
Ethan Furman <ethan@stoneleaf.us>
parents:
84442
diff
changeset
|
178 >>> from json.encoder import JSONEncoder |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
179 >>> JSONEncoder().encode({"foo": ["bar", "baz"]}) |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
180 '{"foo": ["bar", "baz"]}' |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
181 |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
182 """ |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
183 # This is for extremely simple cases and benchmarks. |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
184 if isinstance(o, str): |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
185 if self.ensure_ascii: |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
186 return encode_basestring_ascii(o) |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
187 else: |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
188 return encode_basestring(o) |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
189 # This doesn't pass the iterator directly to ''.join() because the |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
190 # exceptions aren't as detailed. The list call should be roughly |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
191 # equivalent to the PySequence_Fast that ''.join() would do. |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
192 chunks = self.iterencode(o, _one_shot=True) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
193 if not isinstance(chunks, (list, tuple)): |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
194 chunks = list(chunks) |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
195 return ''.join(chunks) |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
196 |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
197 def iterencode(self, o, _one_shot=False): |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
198 """Encode the given object and yield each string |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
199 representation as available. |
|
46737
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
200 |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
201 For example:: |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
202 |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
203 for chunk in JSONEncoder().iterencode(bigobject): |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
204 mysocket.write(chunk) |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
205 |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
206 """ |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
207 if self.check_circular: |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
208 markers = {} |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
209 else: |
|
9f45979558a9
Merged revisions 62734,62736,62748,62769 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents:
diff
changeset
|
210 markers = None |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
211 if self.ensure_ascii: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
212 _encoder = encode_basestring_ascii |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
213 else: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
214 _encoder = encode_basestring |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
215 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
216 def floatstr(o, allow_nan=self.allow_nan, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
217 _repr=FLOAT_REPR, _inf=INFINITY, _neginf=-INFINITY): |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
218 # Check for specials. Note that this type of test is processor |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
219 # and/or platform-specific, so do tests which don't depend on the |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
220 # internals. |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
221 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
222 if o != o: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
223 text = 'NaN' |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
224 elif o == _inf: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
225 text = 'Infinity' |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
226 elif o == _neginf: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
227 text = '-Infinity' |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
228 else: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
229 return _repr(o) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
230 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
231 if not allow_nan: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
232 raise ValueError( |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
233 "Out of range float values are not JSON compliant: " + |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
234 repr(o)) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
235 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
236 return text |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
237 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
238 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
239 if (_one_shot and c_make_encoder is not None |
|
69294
4a1048257995
#10019: Fix regression relative to 2.6: add newlines if indent=0
R David Murray <rdmurray@bitdance.com>
parents:
63575
diff
changeset
|
240 and self.indent is None): |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
241 _iterencode = c_make_encoder( |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
242 markers, self.default, _encoder, self.indent, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
243 self.key_separator, self.item_separator, self.sort_keys, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
244 self.skipkeys, self.allow_nan) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
245 else: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
246 _iterencode = _make_iterencode( |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
247 markers, self.default, _encoder, self.indent, floatstr, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
248 self.key_separator, self.item_separator, self.sort_keys, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
249 self.skipkeys, _one_shot) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
250 return _iterencode(o, 0) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
251 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
252 def _make_iterencode(markers, _default, _encoder, _indent, _floatstr, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
253 _key_separator, _item_separator, _sort_keys, _skipkeys, _one_shot, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
254 ## HACK: hand-optimized bytecode; turn globals into locals |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
255 ValueError=ValueError, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
256 dict=dict, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
257 float=float, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
258 id=id, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
259 int=int, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
260 isinstance=isinstance, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
261 list=list, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
262 str=str, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
263 tuple=tuple, |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
264 ): |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
265 |
|
65804
94c5ad981c1b
Issue #5729: json.dumps to support using '\t' as an indent string
Raymond Hettinger <python@rcn.com>
parents:
63575
diff
changeset
|
266 if _indent is not None and not isinstance(_indent, str): |
|
94c5ad981c1b
Issue #5729: json.dumps to support using '\t' as an indent string
Raymond Hettinger <python@rcn.com>
parents:
63575
diff
changeset
|
267 _indent = ' ' * _indent |
|
94c5ad981c1b
Issue #5729: json.dumps to support using '\t' as an indent string
Raymond Hettinger <python@rcn.com>
parents:
63575
diff
changeset
|
268 |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
269 def _iterencode_list(lst, _current_indent_level): |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
270 if not lst: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
271 yield '[]' |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
272 return |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
273 if markers is not None: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
274 markerid = id(lst) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
275 if markerid in markers: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
276 raise ValueError("Circular reference detected") |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
277 markers[markerid] = lst |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
278 buf = '[' |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
279 if _indent is not None: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
280 _current_indent_level += 1 |
|
65804
94c5ad981c1b
Issue #5729: json.dumps to support using '\t' as an indent string
Raymond Hettinger <python@rcn.com>
parents:
63575
diff
changeset
|
281 newline_indent = '\n' + _indent * _current_indent_level |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
282 separator = _item_separator + newline_indent |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
283 buf += newline_indent |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
284 else: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
285 newline_indent = None |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
286 separator = _item_separator |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
287 first = True |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
288 for value in lst: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
289 if first: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
290 first = False |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
291 else: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
292 buf = separator |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
293 if isinstance(value, str): |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
294 yield buf + _encoder(value) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
295 elif value is None: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
296 yield buf + 'null' |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
297 elif value is True: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
298 yield buf + 'true' |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
299 elif value is False: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
300 yield buf + 'false' |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
301 elif isinstance(value, int): |
|
85103
ae1a7c420f08
Close #18264: int- and float-derived enums now converted to int or float.
Ethan Furman <ethan@stoneleaf.us>
parents:
84442
diff
changeset
|
302 # Subclasses of int/float may override __str__, but we still |
|
ae1a7c420f08
Close #18264: int- and float-derived enums now converted to int or float.
Ethan Furman <ethan@stoneleaf.us>
parents:
84442
diff
changeset
|
303 # want to encode them as integers/floats in JSON. One example |
|
ae1a7c420f08
Close #18264: int- and float-derived enums now converted to int or float.
Ethan Furman <ethan@stoneleaf.us>
parents:
84442
diff
changeset
|
304 # within the standard library is IntEnum. |
|
ae1a7c420f08
Close #18264: int- and float-derived enums now converted to int or float.
Ethan Furman <ethan@stoneleaf.us>
parents:
84442
diff
changeset
|
305 yield buf + str(int(value)) |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
306 elif isinstance(value, float): |
|
85103
ae1a7c420f08
Close #18264: int- and float-derived enums now converted to int or float.
Ethan Furman <ethan@stoneleaf.us>
parents:
84442
diff
changeset
|
307 # see comment above for int |
|
ae1a7c420f08
Close #18264: int- and float-derived enums now converted to int or float.
Ethan Furman <ethan@stoneleaf.us>
parents:
84442
diff
changeset
|
308 yield buf + _floatstr(float(value)) |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
309 else: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
310 yield buf |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
311 if isinstance(value, (list, tuple)): |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
312 chunks = _iterencode_list(value, _current_indent_level) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
313 elif isinstance(value, dict): |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
314 chunks = _iterencode_dict(value, _current_indent_level) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
315 else: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
316 chunks = _iterencode(value, _current_indent_level) |
| 79389 | 317 yield from chunks |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
318 if newline_indent is not None: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
319 _current_indent_level -= 1 |
|
65804
94c5ad981c1b
Issue #5729: json.dumps to support using '\t' as an indent string
Raymond Hettinger <python@rcn.com>
parents:
63575
diff
changeset
|
320 yield '\n' + _indent * _current_indent_level |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
321 yield ']' |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
322 if markers is not None: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
323 del markers[markerid] |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
324 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
325 def _iterencode_dict(dct, _current_indent_level): |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
326 if not dct: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
327 yield '{}' |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
328 return |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
329 if markers is not None: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
330 markerid = id(dct) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
331 if markerid in markers: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
332 raise ValueError("Circular reference detected") |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
333 markers[markerid] = dct |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
334 yield '{' |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
335 if _indent is not None: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
336 _current_indent_level += 1 |
|
65804
94c5ad981c1b
Issue #5729: json.dumps to support using '\t' as an indent string
Raymond Hettinger <python@rcn.com>
parents:
63575
diff
changeset
|
337 newline_indent = '\n' + _indent * _current_indent_level |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
338 item_separator = _item_separator + newline_indent |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
339 yield newline_indent |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
340 else: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
341 newline_indent = None |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
342 item_separator = _item_separator |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
343 first = True |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
344 if _sort_keys: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
345 items = sorted(dct.items(), key=lambda kv: kv[0]) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
346 else: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
347 items = dct.items() |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
348 for key, value in items: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
349 if isinstance(key, str): |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
350 pass |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
351 # JavaScript is weakly typed for these, so it makes sense to |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
352 # also allow them. Many encoders seem to do something like this. |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
353 elif isinstance(key, float): |
|
85103
ae1a7c420f08
Close #18264: int- and float-derived enums now converted to int or float.
Ethan Furman <ethan@stoneleaf.us>
parents:
84442
diff
changeset
|
354 # see comment for int/float in _make_iterencode |
|
ae1a7c420f08
Close #18264: int- and float-derived enums now converted to int or float.
Ethan Furman <ethan@stoneleaf.us>
parents:
84442
diff
changeset
|
355 key = _floatstr(float(key)) |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
356 elif key is True: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
357 key = 'true' |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
358 elif key is False: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
359 key = 'false' |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
360 elif key is None: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
361 key = 'null' |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
362 elif isinstance(key, int): |
|
85103
ae1a7c420f08
Close #18264: int- and float-derived enums now converted to int or float.
Ethan Furman <ethan@stoneleaf.us>
parents:
84442
diff
changeset
|
363 # see comment for int/float in _make_iterencode |
|
ae1a7c420f08
Close #18264: int- and float-derived enums now converted to int or float.
Ethan Furman <ethan@stoneleaf.us>
parents:
84442
diff
changeset
|
364 key = str(int(key)) |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
365 elif _skipkeys: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
366 continue |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
367 else: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
368 raise TypeError("key " + repr(key) + " is not a string") |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
369 if first: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
370 first = False |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
371 else: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
372 yield item_separator |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
373 yield _encoder(key) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
374 yield _key_separator |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
375 if isinstance(value, str): |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
376 yield _encoder(value) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
377 elif value is None: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
378 yield 'null' |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
379 elif value is True: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
380 yield 'true' |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
381 elif value is False: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
382 yield 'false' |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
383 elif isinstance(value, int): |
|
85103
ae1a7c420f08
Close #18264: int- and float-derived enums now converted to int or float.
Ethan Furman <ethan@stoneleaf.us>
parents:
84442
diff
changeset
|
384 # see comment for int/float in _make_iterencode |
|
ae1a7c420f08
Close #18264: int- and float-derived enums now converted to int or float.
Ethan Furman <ethan@stoneleaf.us>
parents:
84442
diff
changeset
|
385 yield str(int(value)) |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
386 elif isinstance(value, float): |
|
85103
ae1a7c420f08
Close #18264: int- and float-derived enums now converted to int or float.
Ethan Furman <ethan@stoneleaf.us>
parents:
84442
diff
changeset
|
387 # see comment for int/float in _make_iterencode |
|
ae1a7c420f08
Close #18264: int- and float-derived enums now converted to int or float.
Ethan Furman <ethan@stoneleaf.us>
parents:
84442
diff
changeset
|
388 yield _floatstr(float(value)) |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
389 else: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
390 if isinstance(value, (list, tuple)): |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
391 chunks = _iterencode_list(value, _current_indent_level) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
392 elif isinstance(value, dict): |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
393 chunks = _iterencode_dict(value, _current_indent_level) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
394 else: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
395 chunks = _iterencode(value, _current_indent_level) |
| 79389 | 396 yield from chunks |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
397 if newline_indent is not None: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
398 _current_indent_level -= 1 |
|
65804
94c5ad981c1b
Issue #5729: json.dumps to support using '\t' as an indent string
Raymond Hettinger <python@rcn.com>
parents:
63575
diff
changeset
|
399 yield '\n' + _indent * _current_indent_level |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
400 yield '}' |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
401 if markers is not None: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
402 del markers[markerid] |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
403 |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
404 def _iterencode(o, _current_indent_level): |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
405 if isinstance(o, str): |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
406 yield _encoder(o) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
407 elif o is None: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
408 yield 'null' |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
409 elif o is True: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
410 yield 'true' |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
411 elif o is False: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
412 yield 'false' |
|
63273
aa19a7cc1bf3
Syntax cleanup.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
54373
diff
changeset
|
413 elif isinstance(o, int): |
|
85103
ae1a7c420f08
Close #18264: int- and float-derived enums now converted to int or float.
Ethan Furman <ethan@stoneleaf.us>
parents:
84442
diff
changeset
|
414 # see comment for int/float in _make_iterencode |
|
ae1a7c420f08
Close #18264: int- and float-derived enums now converted to int or float.
Ethan Furman <ethan@stoneleaf.us>
parents:
84442
diff
changeset
|
415 yield str(int(o)) |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
416 elif isinstance(o, float): |
|
85103
ae1a7c420f08
Close #18264: int- and float-derived enums now converted to int or float.
Ethan Furman <ethan@stoneleaf.us>
parents:
84442
diff
changeset
|
417 # see comment for int/float in _make_iterencode |
|
ae1a7c420f08
Close #18264: int- and float-derived enums now converted to int or float.
Ethan Furman <ethan@stoneleaf.us>
parents:
84442
diff
changeset
|
418 yield _floatstr(float(o)) |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
419 elif isinstance(o, (list, tuple)): |
| 79389 | 420 yield from _iterencode_list(o, _current_indent_level) |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
421 elif isinstance(o, dict): |
| 79389 | 422 yield from _iterencode_dict(o, _current_indent_level) |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
423 else: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
424 if markers is not None: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
425 markerid = id(o) |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
426 if markerid in markers: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
427 raise ValueError("Circular reference detected") |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
428 markers[markerid] = o |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
429 o = _default(o) |
| 79389 | 430 yield from _iterencode(o, _current_indent_level) |
|
53667
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
431 if markers is not None: |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
432 del markers[markerid] |
|
f686aced02a3
port simplejson upgrade from the trunk #4136
Benjamin Peterson <benjamin@python.org>
parents:
46745
diff
changeset
|
433 return _iterencode |
