14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""Implementation of JSONEncoder
24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""
34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport re
44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtry:
64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    from _json import encode_basestring_ascii as c_encode_basestring_ascii
74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexcept ImportError:
84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c_encode_basestring_ascii = None
94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtry:
104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    from _json import make_encoder as c_make_encoder
114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexcept ImportError:
124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c_make_encoder = None
134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmESCAPE = re.compile(r'[\x00-\x1f\\"\b\f\n\r\t]')
154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmESCAPE_ASCII = re.compile(r'([\\"]|[^\ -~])')
164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmHAS_UTF8 = re.compile(r'[\x80-\xff]')
174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmESCAPE_DCT = {
184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    '\\': '\\\\',
194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    '"': '\\"',
204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    '\b': '\\b',
214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    '\f': '\\f',
224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    '\n': '\\n',
234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    '\r': '\\r',
244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    '\t': '\\t',
254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm}
264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfor i in range(0x20):
274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ESCAPE_DCT.setdefault(chr(i), '\\u{0:04x}'.format(i))
284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    #ESCAPE_DCT.setdefault(chr(i), '\\u%04x' % (i,))
294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Assume this produces an infinity on all machines (probably not guaranteed)
314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmINFINITY = float('1e66666')
324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmFLOAT_REPR = repr
334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef encode_basestring(s):
354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Return a JSON representation of a Python string
364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def replace(match):
394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return ESCAPE_DCT[match.group(0)]
404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return '"' + ESCAPE.sub(replace, s) + '"'
414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef py_encode_basestring_ascii(s):
444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Return an ASCII-only JSON representation of a Python string
454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if isinstance(s, str) and HAS_UTF8.search(s) is not None:
484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        s = s.decode('utf-8')
494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def replace(match):
504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        s = match.group(0)
514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return ESCAPE_DCT[s]
534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except KeyError:
544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            n = ord(s)
554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if n < 0x10000:
564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return '\\u{0:04x}'.format(n)
574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                #return '\\u%04x' % (n,)
584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else:
594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                # surrogate pair
604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                n -= 0x10000
614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                s1 = 0xd800 | ((n >> 10) & 0x3ff)
624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                s2 = 0xdc00 | (n & 0x3ff)
634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return '\\u{0:04x}\\u{1:04x}'.format(s1, s2)
644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                #return '\\u%04x\\u%04x' % (s1, s2)
654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return '"' + str(ESCAPE_ASCII.sub(replace, s)) + '"'
664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmencode_basestring_ascii = (
694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    c_encode_basestring_ascii or py_encode_basestring_ascii)
704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass JSONEncoder(object):
724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Extensible JSON <http://json.org> encoder for Python data structures.
734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    Supports the following objects and types by default:
754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    +-------------------+---------------+
774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    | Python            | JSON          |
784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    +===================+===============+
794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    | dict              | object        |
804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    +-------------------+---------------+
814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    | list, tuple       | array         |
824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    +-------------------+---------------+
834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    | str, unicode      | string        |
844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    +-------------------+---------------+
854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    | int, long, float  | number        |
864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    +-------------------+---------------+
874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    | True              | true          |
884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    +-------------------+---------------+
894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    | False             | false         |
904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    +-------------------+---------------+
914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    | None              | null          |
924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    +-------------------+---------------+
934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    To extend this to recognize other objects, subclass and implement a
954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ``.default()`` method with another method that returns a serializable
964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    object for ``o`` if possible, otherwise it should call the superclass
974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    implementation (to raise ``TypeError``).
984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """
1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    item_separator = ', '
1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    key_separator = ': '
1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def __init__(self, skipkeys=False, ensure_ascii=True,
1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            check_circular=True, allow_nan=True, sort_keys=False,
1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            indent=None, separators=None, encoding='utf-8', default=None):
1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """Constructor for JSONEncoder, with sensible defaults.
1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        If skipkeys is false, then it is a TypeError to attempt
1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        encoding of keys that are not str, int, long, float or None.  If
1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        skipkeys is True, such items are simply skipped.
1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        If ensure_ascii is true, the output is guaranteed to be str
1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        objects with all incoming unicode characters escaped.  If
1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ensure_ascii is false, the output will be unicode object.
1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        If check_circular is true, then lists, dicts, and custom encoded
1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        objects will be checked for circular references during encoding to
1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        prevent an infinite recursion (which would cause an OverflowError).
1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Otherwise, no such check takes place.
1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        If allow_nan is true, then NaN, Infinity, and -Infinity will be
1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        encoded as such.  This behavior is not JSON specification compliant,
1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        but is consistent with most JavaScript based encoders and decoders.
1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Otherwise, it will be a ValueError to encode such floats.
1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        If sort_keys is true, then the output of dictionaries will be
1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sorted by key; this is useful for regression tests to ensure
1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        that JSON serializations can be compared on a day-to-day basis.
1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        If indent is a non-negative integer, then JSON array
1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elements and object members will be pretty-printed with that
1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        indent level.  An indent level of 0 will only insert newlines.
1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        None is the most compact representation.
1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        If specified, separators should be a (item_separator, key_separator)
1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        tuple.  The default is (', ', ': ').  To get the most compact JSON
1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        representation you should specify (',', ':') to eliminate whitespace.
1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        If specified, default is a function that gets called for objects
1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        that can't otherwise be serialized.  It should return a JSON encodable
1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        version of the object or raise a ``TypeError``.
1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        If encoding is not None, then all input strings will be
1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        transformed into unicode using that encoding prior to JSON-encoding.
1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        The default is UTF-8.
1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """
1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.skipkeys = skipkeys
1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.ensure_ascii = ensure_ascii
1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_circular = check_circular
1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.allow_nan = allow_nan
1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.sort_keys = sort_keys
1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.indent = indent
1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if separators is not None:
1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.item_separator, self.key_separator = separators
1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if default is not None:
1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.default = default
1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.encoding = encoding
1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def default(self, o):
1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """Implement this method in a subclass such that it returns
1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        a serializable object for ``o``, or calls the base implementation
1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        (to raise a ``TypeError``).
1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        For example, to support arbitrary iterators, you could
1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        implement default like this::
1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def default(self, o):
1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                try:
1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    iterable = iter(o)
1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                except TypeError:
1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    pass
1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                else:
1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    return list(iterable)
1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return JSONEncoder.default(self, o)
1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """
1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        raise TypeError(repr(o) + " is not JSON serializable")
1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def encode(self, o):
1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """Return a JSON string representation of a Python data structure.
1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        >>> JSONEncoder().encode({"foo": ["bar", "baz"]})
1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        '{"foo": ["bar", "baz"]}'
1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """
1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # This is for extremely simple cases and benchmarks.
1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if isinstance(o, basestring):
1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if isinstance(o, str):
1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                _encoding = self.encoding
1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if (_encoding is not None
1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                        and not (_encoding == 'utf-8')):
1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    o = o.decode(_encoding)
1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if self.ensure_ascii:
1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return encode_basestring_ascii(o)
1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else:
1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return encode_basestring(o)
1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # This doesn't pass the iterator directly to ''.join() because the
1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # exceptions aren't as detailed.  The list call should be roughly
2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # equivalent to the PySequence_Fast that ''.join() would do.
2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        chunks = self.iterencode(o, _one_shot=True)
2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if not isinstance(chunks, (list, tuple)):
2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            chunks = list(chunks)
2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return ''.join(chunks)
2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def iterencode(self, o, _one_shot=False):
2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """Encode the given object and yield each string
2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        representation as available.
2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        For example::
2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            for chunk in JSONEncoder().iterencode(bigobject):
2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                mysocket.write(chunk)
2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        """
2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if self.check_circular:
2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            markers = {}
2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else:
2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            markers = None
2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if self.ensure_ascii:
2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            _encoder = encode_basestring_ascii
2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else:
2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            _encoder = encode_basestring
2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if self.encoding != 'utf-8':
2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def _encoder(o, _orig_encoder=_encoder, _encoding=self.encoding):
2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if isinstance(o, str):
2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    o = o.decode(_encoding)
2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return _orig_encoder(o)
2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def floatstr(o, allow_nan=self.allow_nan,
2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                _repr=FLOAT_REPR, _inf=INFINITY, _neginf=-INFINITY):
2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # Check for specials.  Note that this type of test is processor
2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # and/or platform-specific, so do tests which don't depend on the
2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # internals.
2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if o != o:
2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                text = 'NaN'
2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            elif o == _inf:
2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                text = 'Infinity'
2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            elif o == _neginf:
2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                text = '-Infinity'
2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else:
2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                return _repr(o)
2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if not allow_nan:
2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                raise ValueError(
2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    "Out of range float values are not JSON compliant: " +
2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    repr(o))
2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return text
2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if (_one_shot and c_make_encoder is not None
2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                and self.indent is None and not self.sort_keys):
2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            _iterencode = c_make_encoder(
2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                markers, self.default, _encoder, self.indent,
2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.key_separator, self.item_separator, self.sort_keys,
2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.skipkeys, self.allow_nan)
2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else:
2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            _iterencode = _make_iterencode(
2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                markers, self.default, _encoder, self.indent, floatstr,
2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.key_separator, self.item_separator, self.sort_keys,
2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.skipkeys, _one_shot)
2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        return _iterencode(o, 0)
2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        _key_separator, _item_separator, _sort_keys, _skipkeys, _one_shot,
2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ## HACK: hand-optimized bytecode; turn globals into locals
2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ValueError=ValueError,
2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        basestring=basestring,
2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        dict=dict,
2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        float=float,
2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        id=id,
2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        int=int,
2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        isinstance=isinstance,
2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        list=list,
2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        long=long,
2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        str=str,
2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        tuple=tuple,
2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ):
2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def _iterencode_list(lst, _current_indent_level):
2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if not lst:
2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            yield '[]'
2854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return
2864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if markers is not None:
2874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            markerid = id(lst)
2884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if markerid in markers:
2894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                raise ValueError("Circular reference detected")
2904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            markers[markerid] = lst
2914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        buf = '['
2924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if _indent is not None:
2934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            _current_indent_level += 1
2944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            newline_indent = '\n' + (' ' * (_indent * _current_indent_level))
2954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            separator = _item_separator + newline_indent
2964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            buf += newline_indent
2974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else:
2984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            newline_indent = None
2994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            separator = _item_separator
3004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        first = True
3014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for value in lst:
3024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if first:
3034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                first = False
3044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else:
3054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                buf = separator
3064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if isinstance(value, basestring):
3074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                yield buf + _encoder(value)
3084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            elif value is None:
3094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                yield buf + 'null'
3104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            elif value is True:
3114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                yield buf + 'true'
3124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            elif value is False:
3134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                yield buf + 'false'
3144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            elif isinstance(value, (int, long)):
3154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                yield buf + str(value)
3164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            elif isinstance(value, float):
3174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                yield buf + _floatstr(value)
3184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else:
3194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                yield buf
3204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if isinstance(value, (list, tuple)):
3214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    chunks = _iterencode_list(value, _current_indent_level)
3224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                elif isinstance(value, dict):
3234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    chunks = _iterencode_dict(value, _current_indent_level)
3244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                else:
3254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    chunks = _iterencode(value, _current_indent_level)
3264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                for chunk in chunks:
3274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    yield chunk
3284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if newline_indent is not None:
3294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            _current_indent_level -= 1
3304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            yield '\n' + (' ' * (_indent * _current_indent_level))
3314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        yield ']'
3324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if markers is not None:
3334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            del markers[markerid]
3344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def _iterencode_dict(dct, _current_indent_level):
3364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if not dct:
3374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            yield '{}'
3384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            return
3394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if markers is not None:
3404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            markerid = id(dct)
3414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if markerid in markers:
3424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                raise ValueError("Circular reference detected")
3434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            markers[markerid] = dct
3444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        yield '{'
3454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if _indent is not None:
3464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            _current_indent_level += 1
3474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            newline_indent = '\n' + (' ' * (_indent * _current_indent_level))
3484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            item_separator = _item_separator + newline_indent
3494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            yield newline_indent
3504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else:
3514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            newline_indent = None
3524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            item_separator = _item_separator
3534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        first = True
3544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if _sort_keys:
3554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            items = sorted(dct.items(), key=lambda kv: kv[0])
3564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else:
3574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            items = dct.iteritems()
3584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for key, value in items:
3594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if isinstance(key, basestring):
3604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                pass
3614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # JavaScript is weakly typed for these, so it makes sense to
3624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # also allow them.  Many encoders seem to do something like this.
3634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            elif isinstance(key, float):
3644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                key = _floatstr(key)
3654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            elif key is True:
3664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                key = 'true'
3674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            elif key is False:
3684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                key = 'false'
3694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            elif key is None:
3704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                key = 'null'
3714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            elif isinstance(key, (int, long)):
3724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                key = str(key)
3734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            elif _skipkeys:
3744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                continue
3754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else:
3764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                raise TypeError("key " + repr(key) + " is not a string")
3774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if first:
3784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                first = False
3794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else:
3804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                yield item_separator
3814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            yield _encoder(key)
3824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            yield _key_separator
3834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if isinstance(value, basestring):
3844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                yield _encoder(value)
3854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            elif value is None:
3864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                yield 'null'
3874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            elif value is True:
3884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                yield 'true'
3894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            elif value is False:
3904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                yield 'false'
3914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            elif isinstance(value, (int, long)):
3924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                yield str(value)
3934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            elif isinstance(value, float):
3944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                yield _floatstr(value)
3954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else:
3964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if isinstance(value, (list, tuple)):
3974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    chunks = _iterencode_list(value, _current_indent_level)
3984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                elif isinstance(value, dict):
3994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    chunks = _iterencode_dict(value, _current_indent_level)
4004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                else:
4014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    chunks = _iterencode(value, _current_indent_level)
4024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                for chunk in chunks:
4034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    yield chunk
4044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if newline_indent is not None:
4054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            _current_indent_level -= 1
4064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            yield '\n' + (' ' * (_indent * _current_indent_level))
4074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        yield '}'
4084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if markers is not None:
4094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            del markers[markerid]
4104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def _iterencode(o, _current_indent_level):
4124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if isinstance(o, basestring):
4134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            yield _encoder(o)
4144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif o is None:
4154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            yield 'null'
4164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif o is True:
4174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            yield 'true'
4184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif o is False:
4194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            yield 'false'
4204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif isinstance(o, (int, long)):
4214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            yield str(o)
4224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif isinstance(o, float):
4234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            yield _floatstr(o)
4244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif isinstance(o, (list, tuple)):
4254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            for chunk in _iterencode_list(o, _current_indent_level):
4264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                yield chunk
4274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        elif isinstance(o, dict):
4284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            for chunk in _iterencode_dict(o, _current_indent_level):
4294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                yield chunk
4304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else:
4314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if markers is not None:
4324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                markerid = id(o)
4334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if markerid in markers:
4344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    raise ValueError("Circular reference detected")
4354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                markers[markerid] = o
4364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            o = _default(o)
4374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            for chunk in _iterencode(o, _current_indent_level):
4384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                yield chunk
4394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if markers is not None:
4404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                del markers[markerid]
4414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
4424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return _iterencode
443