1d0825bca7fe65beaee391d30da42e937db621564Steve Block"""
2d0825bca7fe65beaee391d30da42e937db621564Steve BlockImplementation of JSONEncoder
3d0825bca7fe65beaee391d30da42e937db621564Steve Block"""
4d0825bca7fe65beaee391d30da42e937db621564Steve Blockimport re
5d0825bca7fe65beaee391d30da42e937db621564Steve Blocktry:
6d0825bca7fe65beaee391d30da42e937db621564Steve Block    from simplejson import _speedups
7d0825bca7fe65beaee391d30da42e937db621564Steve Blockexcept ImportError:
8d0825bca7fe65beaee391d30da42e937db621564Steve Block    _speedups = None
9d0825bca7fe65beaee391d30da42e937db621564Steve Block
10d0825bca7fe65beaee391d30da42e937db621564Steve BlockESCAPE = re.compile(r'[\x00-\x19\\"\b\f\n\r\t]')
11d0825bca7fe65beaee391d30da42e937db621564Steve BlockESCAPE_ASCII = re.compile(r'([\\"/]|[^\ -~])')
12d0825bca7fe65beaee391d30da42e937db621564Steve BlockESCAPE_DCT = {
13d0825bca7fe65beaee391d30da42e937db621564Steve Block    # escape all forward slashes to prevent </script> attack
14d0825bca7fe65beaee391d30da42e937db621564Steve Block    '/': '\\/',
15d0825bca7fe65beaee391d30da42e937db621564Steve Block    '\\': '\\\\',
16d0825bca7fe65beaee391d30da42e937db621564Steve Block    '"': '\\"',
17d0825bca7fe65beaee391d30da42e937db621564Steve Block    '\b': '\\b',
18d0825bca7fe65beaee391d30da42e937db621564Steve Block    '\f': '\\f',
19d0825bca7fe65beaee391d30da42e937db621564Steve Block    '\n': '\\n',
20d0825bca7fe65beaee391d30da42e937db621564Steve Block    '\r': '\\r',
21d0825bca7fe65beaee391d30da42e937db621564Steve Block    '\t': '\\t',
22d0825bca7fe65beaee391d30da42e937db621564Steve Block}
23d0825bca7fe65beaee391d30da42e937db621564Steve Blockfor i in range(0x20):
24d0825bca7fe65beaee391d30da42e937db621564Steve Block    ESCAPE_DCT.setdefault(chr(i), '\\u%04x' % (i,))
25d0825bca7fe65beaee391d30da42e937db621564Steve Block
26d0825bca7fe65beaee391d30da42e937db621564Steve Block# assume this produces an infinity on all machines (probably not guaranteed)
27d0825bca7fe65beaee391d30da42e937db621564Steve BlockINFINITY = float('1e66666')
28d0825bca7fe65beaee391d30da42e937db621564Steve Block
29d0825bca7fe65beaee391d30da42e937db621564Steve Blockdef floatstr(o, allow_nan=True):
30d0825bca7fe65beaee391d30da42e937db621564Steve Block    # Check for specials.  Note that this type of test is processor- and/or
31d0825bca7fe65beaee391d30da42e937db621564Steve Block    # platform-specific, so do tests which don't depend on the internals.
32d0825bca7fe65beaee391d30da42e937db621564Steve Block
33d0825bca7fe65beaee391d30da42e937db621564Steve Block    if o != o:
34d0825bca7fe65beaee391d30da42e937db621564Steve Block        text = 'NaN'
35d0825bca7fe65beaee391d30da42e937db621564Steve Block    elif o == INFINITY:
36d0825bca7fe65beaee391d30da42e937db621564Steve Block        text = 'Infinity'
37d0825bca7fe65beaee391d30da42e937db621564Steve Block    elif o == -INFINITY:
38d0825bca7fe65beaee391d30da42e937db621564Steve Block        text = '-Infinity'
39d0825bca7fe65beaee391d30da42e937db621564Steve Block    else:
40d0825bca7fe65beaee391d30da42e937db621564Steve Block        return repr(o)
41d0825bca7fe65beaee391d30da42e937db621564Steve Block
42d0825bca7fe65beaee391d30da42e937db621564Steve Block    if not allow_nan:
43d0825bca7fe65beaee391d30da42e937db621564Steve Block        raise ValueError("Out of range float values are not JSON compliant: %r"
44d0825bca7fe65beaee391d30da42e937db621564Steve Block            % (o,))
45d0825bca7fe65beaee391d30da42e937db621564Steve Block
46d0825bca7fe65beaee391d30da42e937db621564Steve Block    return text
47d0825bca7fe65beaee391d30da42e937db621564Steve Block
48d0825bca7fe65beaee391d30da42e937db621564Steve Block
49d0825bca7fe65beaee391d30da42e937db621564Steve Blockdef encode_basestring(s):
50d0825bca7fe65beaee391d30da42e937db621564Steve Block    """
51d0825bca7fe65beaee391d30da42e937db621564Steve Block    Return a JSON representation of a Python string
52d0825bca7fe65beaee391d30da42e937db621564Steve Block    """
53d0825bca7fe65beaee391d30da42e937db621564Steve Block    def replace(match):
54d0825bca7fe65beaee391d30da42e937db621564Steve Block        return ESCAPE_DCT[match.group(0)]
55d0825bca7fe65beaee391d30da42e937db621564Steve Block    return '"' + ESCAPE.sub(replace, s) + '"'
56d0825bca7fe65beaee391d30da42e937db621564Steve Block
57d0825bca7fe65beaee391d30da42e937db621564Steve Blockdef encode_basestring_ascii(s):
58d0825bca7fe65beaee391d30da42e937db621564Steve Block    def replace(match):
59d0825bca7fe65beaee391d30da42e937db621564Steve Block        s = match.group(0)
60d0825bca7fe65beaee391d30da42e937db621564Steve Block        try:
61d0825bca7fe65beaee391d30da42e937db621564Steve Block            return ESCAPE_DCT[s]
62d0825bca7fe65beaee391d30da42e937db621564Steve Block        except KeyError:
63d0825bca7fe65beaee391d30da42e937db621564Steve Block            n = ord(s)
64d0825bca7fe65beaee391d30da42e937db621564Steve Block            if n < 0x10000:
65d0825bca7fe65beaee391d30da42e937db621564Steve Block                return '\\u%04x' % (n,)
66d0825bca7fe65beaee391d30da42e937db621564Steve Block            else:
67d0825bca7fe65beaee391d30da42e937db621564Steve Block                # surrogate pair
68d0825bca7fe65beaee391d30da42e937db621564Steve Block                n -= 0x10000
69d0825bca7fe65beaee391d30da42e937db621564Steve Block                s1 = 0xd800 | ((n >> 10) & 0x3ff)
70d0825bca7fe65beaee391d30da42e937db621564Steve Block                s2 = 0xdc00 | (n & 0x3ff)
71d0825bca7fe65beaee391d30da42e937db621564Steve Block                return '\\u%04x\\u%04x' % (s1, s2)
72d0825bca7fe65beaee391d30da42e937db621564Steve Block    return '"' + str(ESCAPE_ASCII.sub(replace, s)) + '"'
73d0825bca7fe65beaee391d30da42e937db621564Steve Block
74d0825bca7fe65beaee391d30da42e937db621564Steve Blocktry:
75d0825bca7fe65beaee391d30da42e937db621564Steve Block    encode_basestring_ascii = _speedups.encode_basestring_ascii
76d0825bca7fe65beaee391d30da42e937db621564Steve Block    _need_utf8 = True
77d0825bca7fe65beaee391d30da42e937db621564Steve Blockexcept AttributeError:
78d0825bca7fe65beaee391d30da42e937db621564Steve Block    _need_utf8 = False
79d0825bca7fe65beaee391d30da42e937db621564Steve Block
80d0825bca7fe65beaee391d30da42e937db621564Steve Blockclass JSONEncoder(object):
81d0825bca7fe65beaee391d30da42e937db621564Steve Block    """
82d0825bca7fe65beaee391d30da42e937db621564Steve Block    Extensible JSON <http://json.org> encoder for Python data structures.
83d0825bca7fe65beaee391d30da42e937db621564Steve Block
84d0825bca7fe65beaee391d30da42e937db621564Steve Block    Supports the following objects and types by default:
85d0825bca7fe65beaee391d30da42e937db621564Steve Block
86d0825bca7fe65beaee391d30da42e937db621564Steve Block    +-------------------+---------------+
87d0825bca7fe65beaee391d30da42e937db621564Steve Block    | Python            | JSON          |
88d0825bca7fe65beaee391d30da42e937db621564Steve Block    +===================+===============+
89d0825bca7fe65beaee391d30da42e937db621564Steve Block    | dict              | object        |
90d0825bca7fe65beaee391d30da42e937db621564Steve Block    +-------------------+---------------+
91d0825bca7fe65beaee391d30da42e937db621564Steve Block    | list, tuple       | array         |
92d0825bca7fe65beaee391d30da42e937db621564Steve Block    +-------------------+---------------+
93d0825bca7fe65beaee391d30da42e937db621564Steve Block    | str, unicode      | string        |
94d0825bca7fe65beaee391d30da42e937db621564Steve Block    +-------------------+---------------+
95d0825bca7fe65beaee391d30da42e937db621564Steve Block    | int, long, float  | number        |
96d0825bca7fe65beaee391d30da42e937db621564Steve Block    +-------------------+---------------+
97d0825bca7fe65beaee391d30da42e937db621564Steve Block    | True              | true          |
98d0825bca7fe65beaee391d30da42e937db621564Steve Block    +-------------------+---------------+
99d0825bca7fe65beaee391d30da42e937db621564Steve Block    | False             | false         |
100d0825bca7fe65beaee391d30da42e937db621564Steve Block    +-------------------+---------------+
101d0825bca7fe65beaee391d30da42e937db621564Steve Block    | None              | null          |
102d0825bca7fe65beaee391d30da42e937db621564Steve Block    +-------------------+---------------+
103d0825bca7fe65beaee391d30da42e937db621564Steve Block
104d0825bca7fe65beaee391d30da42e937db621564Steve Block    To extend this to recognize other objects, subclass and implement a
105d0825bca7fe65beaee391d30da42e937db621564Steve Block    ``.default()`` method with another method that returns a serializable
106d0825bca7fe65beaee391d30da42e937db621564Steve Block    object for ``o`` if possible, otherwise it should call the superclass
107d0825bca7fe65beaee391d30da42e937db621564Steve Block    implementation (to raise ``TypeError``).
108d0825bca7fe65beaee391d30da42e937db621564Steve Block    """
109d0825bca7fe65beaee391d30da42e937db621564Steve Block    __all__ = ['__init__', 'default', 'encode', 'iterencode']
110d0825bca7fe65beaee391d30da42e937db621564Steve Block    item_separator = ', '
111d0825bca7fe65beaee391d30da42e937db621564Steve Block    key_separator = ': '
112d0825bca7fe65beaee391d30da42e937db621564Steve Block    def __init__(self, skipkeys=False, ensure_ascii=True,
113d0825bca7fe65beaee391d30da42e937db621564Steve Block            check_circular=True, allow_nan=True, sort_keys=False,
114d0825bca7fe65beaee391d30da42e937db621564Steve Block            indent=None, separators=None, encoding='utf-8'):
115d0825bca7fe65beaee391d30da42e937db621564Steve Block        """
116d0825bca7fe65beaee391d30da42e937db621564Steve Block        Constructor for JSONEncoder, with sensible defaults.
117d0825bca7fe65beaee391d30da42e937db621564Steve Block
118d0825bca7fe65beaee391d30da42e937db621564Steve Block        If skipkeys is False, then it is a TypeError to attempt
119d0825bca7fe65beaee391d30da42e937db621564Steve Block        encoding of keys that are not str, int, long, float or None.  If
120d0825bca7fe65beaee391d30da42e937db621564Steve Block        skipkeys is True, such items are simply skipped.
121d0825bca7fe65beaee391d30da42e937db621564Steve Block
122d0825bca7fe65beaee391d30da42e937db621564Steve Block        If ensure_ascii is True, the output is guaranteed to be str
123d0825bca7fe65beaee391d30da42e937db621564Steve Block        objects with all incoming unicode characters escaped.  If
124d0825bca7fe65beaee391d30da42e937db621564Steve Block        ensure_ascii is false, the output will be unicode object.
125d0825bca7fe65beaee391d30da42e937db621564Steve Block
126d0825bca7fe65beaee391d30da42e937db621564Steve Block        If check_circular is True, then lists, dicts, and custom encoded
127d0825bca7fe65beaee391d30da42e937db621564Steve Block        objects will be checked for circular references during encoding to
128d0825bca7fe65beaee391d30da42e937db621564Steve Block        prevent an infinite recursion (which would cause an OverflowError).
129d0825bca7fe65beaee391d30da42e937db621564Steve Block        Otherwise, no such check takes place.
130d0825bca7fe65beaee391d30da42e937db621564Steve Block
131d0825bca7fe65beaee391d30da42e937db621564Steve Block        If allow_nan is True, then NaN, Infinity, and -Infinity will be
132d0825bca7fe65beaee391d30da42e937db621564Steve Block        encoded as such.  This behavior is not JSON specification compliant,
133d0825bca7fe65beaee391d30da42e937db621564Steve Block        but is consistent with most JavaScript based encoders and decoders.
134d0825bca7fe65beaee391d30da42e937db621564Steve Block        Otherwise, it will be a ValueError to encode such floats.
135d0825bca7fe65beaee391d30da42e937db621564Steve Block
136d0825bca7fe65beaee391d30da42e937db621564Steve Block        If sort_keys is True, then the output of dictionaries will be
137d0825bca7fe65beaee391d30da42e937db621564Steve Block        sorted by key; this is useful for regression tests to ensure
138d0825bca7fe65beaee391d30da42e937db621564Steve Block        that JSON serializations can be compared on a day-to-day basis.
139d0825bca7fe65beaee391d30da42e937db621564Steve Block
140d0825bca7fe65beaee391d30da42e937db621564Steve Block        If indent is a non-negative integer, then JSON array
141d0825bca7fe65beaee391d30da42e937db621564Steve Block        elements and object members will be pretty-printed with that
142d0825bca7fe65beaee391d30da42e937db621564Steve Block        indent level.  An indent level of 0 will only insert newlines.
143d0825bca7fe65beaee391d30da42e937db621564Steve Block        None is the most compact representation.
144d0825bca7fe65beaee391d30da42e937db621564Steve Block
145d0825bca7fe65beaee391d30da42e937db621564Steve Block        If specified, separators should be a (item_separator, key_separator)
146d0825bca7fe65beaee391d30da42e937db621564Steve Block        tuple. The default is (', ', ': '). To get the most compact JSON
147d0825bca7fe65beaee391d30da42e937db621564Steve Block        representation you should specify (',', ':') to eliminate whitespace.
148d0825bca7fe65beaee391d30da42e937db621564Steve Block
149d0825bca7fe65beaee391d30da42e937db621564Steve Block        If encoding is not None, then all input strings will be
150d0825bca7fe65beaee391d30da42e937db621564Steve Block        transformed into unicode using that encoding prior to JSON-encoding.
151d0825bca7fe65beaee391d30da42e937db621564Steve Block        The default is UTF-8.
152d0825bca7fe65beaee391d30da42e937db621564Steve Block        """
153d0825bca7fe65beaee391d30da42e937db621564Steve Block
154d0825bca7fe65beaee391d30da42e937db621564Steve Block        self.skipkeys = skipkeys
155d0825bca7fe65beaee391d30da42e937db621564Steve Block        self.ensure_ascii = ensure_ascii
156d0825bca7fe65beaee391d30da42e937db621564Steve Block        self.check_circular = check_circular
157d0825bca7fe65beaee391d30da42e937db621564Steve Block        self.allow_nan = allow_nan
158d0825bca7fe65beaee391d30da42e937db621564Steve Block        self.sort_keys = sort_keys
159d0825bca7fe65beaee391d30da42e937db621564Steve Block        self.indent = indent
160d0825bca7fe65beaee391d30da42e937db621564Steve Block        self.current_indent_level = 0
161d0825bca7fe65beaee391d30da42e937db621564Steve Block        if separators is not None:
162d0825bca7fe65beaee391d30da42e937db621564Steve Block            self.item_separator, self.key_separator = separators
163d0825bca7fe65beaee391d30da42e937db621564Steve Block        self.encoding = encoding
164d0825bca7fe65beaee391d30da42e937db621564Steve Block
165d0825bca7fe65beaee391d30da42e937db621564Steve Block    def _newline_indent(self):
166d0825bca7fe65beaee391d30da42e937db621564Steve Block        return '\n' + (' ' * (self.indent * self.current_indent_level))
167d0825bca7fe65beaee391d30da42e937db621564Steve Block
168d0825bca7fe65beaee391d30da42e937db621564Steve Block    def _iterencode_list(self, lst, markers=None):
169d0825bca7fe65beaee391d30da42e937db621564Steve Block        if not lst:
170d0825bca7fe65beaee391d30da42e937db621564Steve Block            yield '[]'
171d0825bca7fe65beaee391d30da42e937db621564Steve Block            return
172d0825bca7fe65beaee391d30da42e937db621564Steve Block        if markers is not None:
173d0825bca7fe65beaee391d30da42e937db621564Steve Block            markerid = id(lst)
174d0825bca7fe65beaee391d30da42e937db621564Steve Block            if markerid in markers:
175d0825bca7fe65beaee391d30da42e937db621564Steve Block                raise ValueError("Circular reference detected")
176d0825bca7fe65beaee391d30da42e937db621564Steve Block            markers[markerid] = lst
177d0825bca7fe65beaee391d30da42e937db621564Steve Block        yield '['
178d0825bca7fe65beaee391d30da42e937db621564Steve Block        if self.indent is not None:
179d0825bca7fe65beaee391d30da42e937db621564Steve Block            self.current_indent_level += 1
180d0825bca7fe65beaee391d30da42e937db621564Steve Block            newline_indent = self._newline_indent()
181d0825bca7fe65beaee391d30da42e937db621564Steve Block            separator = self.item_separator + newline_indent
182d0825bca7fe65beaee391d30da42e937db621564Steve Block            yield newline_indent
183d0825bca7fe65beaee391d30da42e937db621564Steve Block        else:
184d0825bca7fe65beaee391d30da42e937db621564Steve Block            newline_indent = None
185d0825bca7fe65beaee391d30da42e937db621564Steve Block            separator = self.item_separator
186d0825bca7fe65beaee391d30da42e937db621564Steve Block        first = True
187d0825bca7fe65beaee391d30da42e937db621564Steve Block        for value in lst:
188d0825bca7fe65beaee391d30da42e937db621564Steve Block            if first:
189d0825bca7fe65beaee391d30da42e937db621564Steve Block                first = False
190d0825bca7fe65beaee391d30da42e937db621564Steve Block            else:
191d0825bca7fe65beaee391d30da42e937db621564Steve Block                yield separator
192d0825bca7fe65beaee391d30da42e937db621564Steve Block            for chunk in self._iterencode(value, markers):
193d0825bca7fe65beaee391d30da42e937db621564Steve Block                yield chunk
194d0825bca7fe65beaee391d30da42e937db621564Steve Block        if newline_indent is not None:
195d0825bca7fe65beaee391d30da42e937db621564Steve Block            self.current_indent_level -= 1
196d0825bca7fe65beaee391d30da42e937db621564Steve Block            yield self._newline_indent()
197d0825bca7fe65beaee391d30da42e937db621564Steve Block        yield ']'
198d0825bca7fe65beaee391d30da42e937db621564Steve Block        if markers is not None:
199d0825bca7fe65beaee391d30da42e937db621564Steve Block            del markers[markerid]
200d0825bca7fe65beaee391d30da42e937db621564Steve Block
201d0825bca7fe65beaee391d30da42e937db621564Steve Block    def _iterencode_dict(self, dct, markers=None):
202d0825bca7fe65beaee391d30da42e937db621564Steve Block        if not dct:
203d0825bca7fe65beaee391d30da42e937db621564Steve Block            yield '{}'
204d0825bca7fe65beaee391d30da42e937db621564Steve Block            return
205d0825bca7fe65beaee391d30da42e937db621564Steve Block        if markers is not None:
206d0825bca7fe65beaee391d30da42e937db621564Steve Block            markerid = id(dct)
207d0825bca7fe65beaee391d30da42e937db621564Steve Block            if markerid in markers:
208d0825bca7fe65beaee391d30da42e937db621564Steve Block                raise ValueError("Circular reference detected")
209d0825bca7fe65beaee391d30da42e937db621564Steve Block            markers[markerid] = dct
210d0825bca7fe65beaee391d30da42e937db621564Steve Block        yield '{'
211d0825bca7fe65beaee391d30da42e937db621564Steve Block        key_separator = self.key_separator
212d0825bca7fe65beaee391d30da42e937db621564Steve Block        if self.indent is not None:
213d0825bca7fe65beaee391d30da42e937db621564Steve Block            self.current_indent_level += 1
214d0825bca7fe65beaee391d30da42e937db621564Steve Block            newline_indent = self._newline_indent()
215d0825bca7fe65beaee391d30da42e937db621564Steve Block            item_separator = self.item_separator + newline_indent
216d0825bca7fe65beaee391d30da42e937db621564Steve Block            yield newline_indent
217d0825bca7fe65beaee391d30da42e937db621564Steve Block        else:
218d0825bca7fe65beaee391d30da42e937db621564Steve Block            newline_indent = None
219d0825bca7fe65beaee391d30da42e937db621564Steve Block            item_separator = self.item_separator
220d0825bca7fe65beaee391d30da42e937db621564Steve Block        first = True
221d0825bca7fe65beaee391d30da42e937db621564Steve Block        if self.ensure_ascii:
222d0825bca7fe65beaee391d30da42e937db621564Steve Block            encoder = encode_basestring_ascii
223d0825bca7fe65beaee391d30da42e937db621564Steve Block        else:
224d0825bca7fe65beaee391d30da42e937db621564Steve Block            encoder = encode_basestring
225d0825bca7fe65beaee391d30da42e937db621564Steve Block        allow_nan = self.allow_nan
226d0825bca7fe65beaee391d30da42e937db621564Steve Block        if self.sort_keys:
227d0825bca7fe65beaee391d30da42e937db621564Steve Block            keys = dct.keys()
228d0825bca7fe65beaee391d30da42e937db621564Steve Block            keys.sort()
229d0825bca7fe65beaee391d30da42e937db621564Steve Block            items = [(k, dct[k]) for k in keys]
230d0825bca7fe65beaee391d30da42e937db621564Steve Block        else:
231d0825bca7fe65beaee391d30da42e937db621564Steve Block            items = dct.iteritems()
232d0825bca7fe65beaee391d30da42e937db621564Steve Block        _encoding = self.encoding
233d0825bca7fe65beaee391d30da42e937db621564Steve Block        _do_decode = (_encoding is not None
234d0825bca7fe65beaee391d30da42e937db621564Steve Block            and not (_need_utf8 and _encoding == 'utf-8'))
235d0825bca7fe65beaee391d30da42e937db621564Steve Block        for key, value in items:
236d0825bca7fe65beaee391d30da42e937db621564Steve Block            if isinstance(key, str):
237d0825bca7fe65beaee391d30da42e937db621564Steve Block                if _do_decode:
238d0825bca7fe65beaee391d30da42e937db621564Steve Block                    key = key.decode(_encoding)
239d0825bca7fe65beaee391d30da42e937db621564Steve Block            elif isinstance(key, basestring):
240d0825bca7fe65beaee391d30da42e937db621564Steve Block                pass
241d0825bca7fe65beaee391d30da42e937db621564Steve Block            # JavaScript is weakly typed for these, so it makes sense to
242d0825bca7fe65beaee391d30da42e937db621564Steve Block            # also allow them.  Many encoders seem to do something like this.
243d0825bca7fe65beaee391d30da42e937db621564Steve Block            elif isinstance(key, float):
244d0825bca7fe65beaee391d30da42e937db621564Steve Block                key = floatstr(key, allow_nan)
245d0825bca7fe65beaee391d30da42e937db621564Steve Block            elif isinstance(key, (int, long)):
246d0825bca7fe65beaee391d30da42e937db621564Steve Block                key = str(key)
247d0825bca7fe65beaee391d30da42e937db621564Steve Block            elif key is True:
248d0825bca7fe65beaee391d30da42e937db621564Steve Block                key = 'true'
249d0825bca7fe65beaee391d30da42e937db621564Steve Block            elif key is False:
250d0825bca7fe65beaee391d30da42e937db621564Steve Block                key = 'false'
251d0825bca7fe65beaee391d30da42e937db621564Steve Block            elif key is None:
252d0825bca7fe65beaee391d30da42e937db621564Steve Block                key = 'null'
253d0825bca7fe65beaee391d30da42e937db621564Steve Block            elif self.skipkeys:
254d0825bca7fe65beaee391d30da42e937db621564Steve Block                continue
255d0825bca7fe65beaee391d30da42e937db621564Steve Block            else:
256d0825bca7fe65beaee391d30da42e937db621564Steve Block                raise TypeError("key %r is not a string" % (key,))
257d0825bca7fe65beaee391d30da42e937db621564Steve Block            if first:
258d0825bca7fe65beaee391d30da42e937db621564Steve Block                first = False
259d0825bca7fe65beaee391d30da42e937db621564Steve Block            else:
260d0825bca7fe65beaee391d30da42e937db621564Steve Block                yield item_separator
261d0825bca7fe65beaee391d30da42e937db621564Steve Block            yield encoder(key)
262d0825bca7fe65beaee391d30da42e937db621564Steve Block            yield key_separator
263d0825bca7fe65beaee391d30da42e937db621564Steve Block            for chunk in self._iterencode(value, markers):
264d0825bca7fe65beaee391d30da42e937db621564Steve Block                yield chunk
265d0825bca7fe65beaee391d30da42e937db621564Steve Block        if newline_indent is not None:
266d0825bca7fe65beaee391d30da42e937db621564Steve Block            self.current_indent_level -= 1
267d0825bca7fe65beaee391d30da42e937db621564Steve Block            yield self._newline_indent()
268d0825bca7fe65beaee391d30da42e937db621564Steve Block        yield '}'
269d0825bca7fe65beaee391d30da42e937db621564Steve Block        if markers is not None:
270d0825bca7fe65beaee391d30da42e937db621564Steve Block            del markers[markerid]
271d0825bca7fe65beaee391d30da42e937db621564Steve Block
272d0825bca7fe65beaee391d30da42e937db621564Steve Block    def _iterencode(self, o, markers=None):
273d0825bca7fe65beaee391d30da42e937db621564Steve Block        if isinstance(o, basestring):
274d0825bca7fe65beaee391d30da42e937db621564Steve Block            if self.ensure_ascii:
275d0825bca7fe65beaee391d30da42e937db621564Steve Block                encoder = encode_basestring_ascii
276d0825bca7fe65beaee391d30da42e937db621564Steve Block            else:
277d0825bca7fe65beaee391d30da42e937db621564Steve Block                encoder = encode_basestring
278d0825bca7fe65beaee391d30da42e937db621564Steve Block            _encoding = self.encoding
279d0825bca7fe65beaee391d30da42e937db621564Steve Block            if (_encoding is not None and isinstance(o, str)
280d0825bca7fe65beaee391d30da42e937db621564Steve Block                    and not (_need_utf8 and _encoding == 'utf-8')):
281d0825bca7fe65beaee391d30da42e937db621564Steve Block                o = o.decode(_encoding)
282d0825bca7fe65beaee391d30da42e937db621564Steve Block            yield encoder(o)
283d0825bca7fe65beaee391d30da42e937db621564Steve Block        elif o is None:
284d0825bca7fe65beaee391d30da42e937db621564Steve Block            yield 'null'
285d0825bca7fe65beaee391d30da42e937db621564Steve Block        elif o is True:
286d0825bca7fe65beaee391d30da42e937db621564Steve Block            yield 'true'
287d0825bca7fe65beaee391d30da42e937db621564Steve Block        elif o is False:
288d0825bca7fe65beaee391d30da42e937db621564Steve Block            yield 'false'
289d0825bca7fe65beaee391d30da42e937db621564Steve Block        elif isinstance(o, (int, long)):
290d0825bca7fe65beaee391d30da42e937db621564Steve Block            yield str(o)
291d0825bca7fe65beaee391d30da42e937db621564Steve Block        elif isinstance(o, float):
292d0825bca7fe65beaee391d30da42e937db621564Steve Block            yield floatstr(o, self.allow_nan)
293d0825bca7fe65beaee391d30da42e937db621564Steve Block        elif isinstance(o, (list, tuple)):
294d0825bca7fe65beaee391d30da42e937db621564Steve Block            for chunk in self._iterencode_list(o, markers):
295d0825bca7fe65beaee391d30da42e937db621564Steve Block                yield chunk
296d0825bca7fe65beaee391d30da42e937db621564Steve Block        elif isinstance(o, dict):
297d0825bca7fe65beaee391d30da42e937db621564Steve Block            for chunk in self._iterencode_dict(o, markers):
298d0825bca7fe65beaee391d30da42e937db621564Steve Block                yield chunk
299d0825bca7fe65beaee391d30da42e937db621564Steve Block        else:
300d0825bca7fe65beaee391d30da42e937db621564Steve Block            if markers is not None:
301d0825bca7fe65beaee391d30da42e937db621564Steve Block                markerid = id(o)
302d0825bca7fe65beaee391d30da42e937db621564Steve Block                if markerid in markers:
303d0825bca7fe65beaee391d30da42e937db621564Steve Block                    raise ValueError("Circular reference detected")
304d0825bca7fe65beaee391d30da42e937db621564Steve Block                markers[markerid] = o
305d0825bca7fe65beaee391d30da42e937db621564Steve Block            for chunk in self._iterencode_default(o, markers):
306d0825bca7fe65beaee391d30da42e937db621564Steve Block                yield chunk
307d0825bca7fe65beaee391d30da42e937db621564Steve Block            if markers is not None:
308d0825bca7fe65beaee391d30da42e937db621564Steve Block                del markers[markerid]
309d0825bca7fe65beaee391d30da42e937db621564Steve Block
310d0825bca7fe65beaee391d30da42e937db621564Steve Block    def _iterencode_default(self, o, markers=None):
311d0825bca7fe65beaee391d30da42e937db621564Steve Block        newobj = self.default(o)
312d0825bca7fe65beaee391d30da42e937db621564Steve Block        return self._iterencode(newobj, markers)
313d0825bca7fe65beaee391d30da42e937db621564Steve Block
314d0825bca7fe65beaee391d30da42e937db621564Steve Block    def default(self, o):
315d0825bca7fe65beaee391d30da42e937db621564Steve Block        """
316d0825bca7fe65beaee391d30da42e937db621564Steve Block        Implement this method in a subclass such that it returns
317d0825bca7fe65beaee391d30da42e937db621564Steve Block        a serializable object for ``o``, or calls the base implementation
318d0825bca7fe65beaee391d30da42e937db621564Steve Block        (to raise a ``TypeError``).
319d0825bca7fe65beaee391d30da42e937db621564Steve Block
320d0825bca7fe65beaee391d30da42e937db621564Steve Block        For example, to support arbitrary iterators, you could
321d0825bca7fe65beaee391d30da42e937db621564Steve Block        implement default like this::
322d0825bca7fe65beaee391d30da42e937db621564Steve Block
323d0825bca7fe65beaee391d30da42e937db621564Steve Block            def default(self, o):
324d0825bca7fe65beaee391d30da42e937db621564Steve Block                try:
325d0825bca7fe65beaee391d30da42e937db621564Steve Block                    iterable = iter(o)
326d0825bca7fe65beaee391d30da42e937db621564Steve Block                except TypeError:
327d0825bca7fe65beaee391d30da42e937db621564Steve Block                    pass
328d0825bca7fe65beaee391d30da42e937db621564Steve Block                else:
329d0825bca7fe65beaee391d30da42e937db621564Steve Block                    return list(iterable)
330d0825bca7fe65beaee391d30da42e937db621564Steve Block                return JSONEncoder.default(self, o)
331d0825bca7fe65beaee391d30da42e937db621564Steve Block        """
332d0825bca7fe65beaee391d30da42e937db621564Steve Block        raise TypeError("%r is not JSON serializable" % (o,))
333d0825bca7fe65beaee391d30da42e937db621564Steve Block
334d0825bca7fe65beaee391d30da42e937db621564Steve Block    def encode(self, o):
335d0825bca7fe65beaee391d30da42e937db621564Steve Block        """
336d0825bca7fe65beaee391d30da42e937db621564Steve Block        Return a JSON string representation of a Python data structure.
337d0825bca7fe65beaee391d30da42e937db621564Steve Block
338d0825bca7fe65beaee391d30da42e937db621564Steve Block        >>> JSONEncoder().encode({"foo": ["bar", "baz"]})
339d0825bca7fe65beaee391d30da42e937db621564Steve Block        '{"foo":["bar", "baz"]}'
340d0825bca7fe65beaee391d30da42e937db621564Steve Block        """
341d0825bca7fe65beaee391d30da42e937db621564Steve Block        # This is for extremely simple cases and benchmarks...
342d0825bca7fe65beaee391d30da42e937db621564Steve Block        if isinstance(o, basestring):
343d0825bca7fe65beaee391d30da42e937db621564Steve Block            if isinstance(o, str):
344d0825bca7fe65beaee391d30da42e937db621564Steve Block                _encoding = self.encoding
345d0825bca7fe65beaee391d30da42e937db621564Steve Block                if (_encoding is not None
346d0825bca7fe65beaee391d30da42e937db621564Steve Block                        and not (_encoding == 'utf-8' and _need_utf8)):
347d0825bca7fe65beaee391d30da42e937db621564Steve Block                    o = o.decode(_encoding)
348d0825bca7fe65beaee391d30da42e937db621564Steve Block            return encode_basestring_ascii(o)
349d0825bca7fe65beaee391d30da42e937db621564Steve Block        # This doesn't pass the iterator directly to ''.join() because it
350d0825bca7fe65beaee391d30da42e937db621564Steve Block        # sucks at reporting exceptions.  It's going to do this internally
351d0825bca7fe65beaee391d30da42e937db621564Steve Block        # anyway because it uses PySequence_Fast or similar.
352d0825bca7fe65beaee391d30da42e937db621564Steve Block        chunks = list(self.iterencode(o))
353d0825bca7fe65beaee391d30da42e937db621564Steve Block        return ''.join(chunks)
354d0825bca7fe65beaee391d30da42e937db621564Steve Block
355d0825bca7fe65beaee391d30da42e937db621564Steve Block    def iterencode(self, o):
356d0825bca7fe65beaee391d30da42e937db621564Steve Block        """
357d0825bca7fe65beaee391d30da42e937db621564Steve Block        Encode the given object and yield each string
358d0825bca7fe65beaee391d30da42e937db621564Steve Block        representation as available.
359d0825bca7fe65beaee391d30da42e937db621564Steve Block
360d0825bca7fe65beaee391d30da42e937db621564Steve Block        For example::
361d0825bca7fe65beaee391d30da42e937db621564Steve Block
362d0825bca7fe65beaee391d30da42e937db621564Steve Block            for chunk in JSONEncoder().iterencode(bigobject):
363d0825bca7fe65beaee391d30da42e937db621564Steve Block                mysocket.write(chunk)
364d0825bca7fe65beaee391d30da42e937db621564Steve Block        """
365d0825bca7fe65beaee391d30da42e937db621564Steve Block        if self.check_circular:
366d0825bca7fe65beaee391d30da42e937db621564Steve Block            markers = {}
367d0825bca7fe65beaee391d30da42e937db621564Steve Block        else:
368d0825bca7fe65beaee391d30da42e937db621564Steve Block            markers = None
369d0825bca7fe65beaee391d30da42e937db621564Steve Block        return self._iterencode(o, markers)
370d0825bca7fe65beaee391d30da42e937db621564Steve Block
371d0825bca7fe65beaee391d30da42e937db621564Steve Block__all__ = ['JSONEncoder']
372