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