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