simplejson 4.3.0__cp313-cp313-win_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. simplejson/__init__.py +571 -0
  2. simplejson/_speedups.cp313-win_arm64.pyd +0 -0
  3. simplejson/compat.py +32 -0
  4. simplejson/decoder.py +430 -0
  5. simplejson/encoder.py +867 -0
  6. simplejson/errors.py +53 -0
  7. simplejson/ordered_dict.py +103 -0
  8. simplejson/raw_json.py +9 -0
  9. simplejson/scanner.py +87 -0
  10. simplejson/tests/__init__.py +97 -0
  11. simplejson/tests/_cibw_runner.py +7 -0
  12. simplejson/tests/_helpers.py +17 -0
  13. simplejson/tests/test_bigint_as_string.py +67 -0
  14. simplejson/tests/test_bitsize_int_as_string.py +217 -0
  15. simplejson/tests/test_check_circular.py +158 -0
  16. simplejson/tests/test_custom_method_cycles.py +71 -0
  17. simplejson/tests/test_decimal.py +149 -0
  18. simplejson/tests/test_decode.py +272 -0
  19. simplejson/tests/test_default.py +9 -0
  20. simplejson/tests/test_dump.py +564 -0
  21. simplejson/tests/test_encode_basestring_ascii.py +47 -0
  22. simplejson/tests/test_encode_for_html.py +38 -0
  23. simplejson/tests/test_errors.py +247 -0
  24. simplejson/tests/test_fail.py +206 -0
  25. simplejson/tests/test_float.py +59 -0
  26. simplejson/tests/test_for_json.py +148 -0
  27. simplejson/tests/test_free_threading.py +100 -0
  28. simplejson/tests/test_indent.py +86 -0
  29. simplejson/tests/test_item_sort_key.py +68 -0
  30. simplejson/tests/test_iterable.py +263 -0
  31. simplejson/tests/test_namedtuple.py +206 -0
  32. simplejson/tests/test_pass1.py +71 -0
  33. simplejson/tests/test_pass2.py +14 -0
  34. simplejson/tests/test_pass3.py +20 -0
  35. simplejson/tests/test_raw_json.py +47 -0
  36. simplejson/tests/test_recursion.py +67 -0
  37. simplejson/tests/test_scanstring.py +339 -0
  38. simplejson/tests/test_separators.py +42 -0
  39. simplejson/tests/test_speedups.py +333 -0
  40. simplejson/tests/test_str_subclass.py +21 -0
  41. simplejson/tests/test_subclass.py +37 -0
  42. simplejson/tests/test_subinterpreters.py +125 -0
  43. simplejson/tests/test_tool.py +134 -0
  44. simplejson/tests/test_tuple.py +47 -0
  45. simplejson/tests/test_unicode.py +154 -0
  46. simplejson/tool.py +41 -0
  47. simplejson-4.3.0.dist-info/METADATA +100 -0
  48. simplejson-4.3.0.dist-info/RECORD +51 -0
  49. simplejson-4.3.0.dist-info/WHEEL +5 -0
  50. simplejson-4.3.0.dist-info/licenses/LICENSE.txt +79 -0
  51. simplejson-4.3.0.dist-info/top_level.txt +1 -0
simplejson/__init__.py ADDED
@@ -0,0 +1,571 @@
1
+ r"""JSON (JavaScript Object Notation) <http://json.org> is a subset of
2
+ JavaScript syntax (ECMA-262 3rd edition) used as a lightweight data
3
+ interchange format.
4
+
5
+ :mod:`simplejson` exposes an API familiar to users of the standard library
6
+ :mod:`marshal` and :mod:`pickle` modules. It is the externally maintained
7
+ version of the :mod:`json` library contained in Python 2.6+, supporting
8
+ Python 2.7 and Python 3.9+, and has significant performance advantages,
9
+ even without using the optional C extension for speedups.
10
+
11
+ Encoding basic Python object hierarchies::
12
+
13
+ >>> import simplejson as json
14
+ >>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
15
+ '["foo", {"bar": ["baz", null, 1.0, 2]}]'
16
+ >>> print(json.dumps("\"foo\bar"))
17
+ "\"foo\bar"
18
+ >>> print(json.dumps(u'\u1234'))
19
+ "\u1234"
20
+ >>> print(json.dumps('\\'))
21
+ "\\"
22
+ >>> print(json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True))
23
+ {"a": 0, "b": 0, "c": 0}
24
+ >>> from simplejson.compat import StringIO
25
+ >>> io = StringIO()
26
+ >>> json.dump(['streaming API'], io)
27
+ >>> io.getvalue()
28
+ '["streaming API"]'
29
+
30
+ Compact encoding::
31
+
32
+ >>> import simplejson as json
33
+ >>> obj = [1,2,3,{'4': 5, '6': 7}]
34
+ >>> json.dumps(obj, separators=(',',':'), sort_keys=True)
35
+ '[1,2,3,{"4":5,"6":7}]'
36
+
37
+ Pretty printing::
38
+
39
+ >>> import simplejson as json
40
+ >>> print(json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=' '))
41
+ {
42
+ "4": 5,
43
+ "6": 7
44
+ }
45
+
46
+ Decoding JSON::
47
+
48
+ >>> import simplejson as json
49
+ >>> obj = [u'foo', {u'bar': [u'baz', None, 1.0, 2]}]
50
+ >>> json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]') == obj
51
+ True
52
+ >>> json.loads('"\\"foo\\bar"') == u'"foo\x08ar'
53
+ True
54
+ >>> from simplejson.compat import StringIO
55
+ >>> io = StringIO('["streaming API"]')
56
+ >>> json.load(io)[0] == 'streaming API'
57
+ True
58
+
59
+ Specializing JSON object decoding::
60
+
61
+ >>> import simplejson as json
62
+ >>> def as_complex(dct):
63
+ ... if '__complex__' in dct:
64
+ ... return complex(dct['real'], dct['imag'])
65
+ ... return dct
66
+ ...
67
+ >>> json.loads('{"__complex__": true, "real": 1, "imag": 2}',
68
+ ... object_hook=as_complex)
69
+ (1+2j)
70
+ >>> from decimal import Decimal
71
+ >>> json.loads('1.1', parse_float=Decimal) == Decimal('1.1')
72
+ True
73
+
74
+ Specializing JSON object encoding::
75
+
76
+ >>> import simplejson as json
77
+ >>> def encode_complex(obj):
78
+ ... if isinstance(obj, complex):
79
+ ... return [obj.real, obj.imag]
80
+ ... raise TypeError('Object of type %s is not JSON serializable' %
81
+ ... obj.__class__.__name__)
82
+ ...
83
+ >>> json.dumps(2 + 1j, default=encode_complex)
84
+ '[2.0, 1.0]'
85
+ >>> json.JSONEncoder(default=encode_complex).encode(2 + 1j)
86
+ '[2.0, 1.0]'
87
+ >>> ''.join(json.JSONEncoder(default=encode_complex).iterencode(2 + 1j))
88
+ '[2.0, 1.0]'
89
+
90
+ Using simplejson.tool from the shell to validate and pretty-print::
91
+
92
+ $ echo '{"json":"obj"}' | python -m simplejson.tool
93
+ {
94
+ "json": "obj"
95
+ }
96
+ $ echo '{ 1.2:3.4}' | python -m simplejson.tool
97
+ Expecting property name: line 1 column 3 (char 2)
98
+
99
+ Parsing multiple documents serialized as JSON lines (newline-delimited JSON)::
100
+
101
+ >>> import simplejson as json
102
+ >>> def loads_lines(docs):
103
+ ... for doc in docs.splitlines():
104
+ ... yield json.loads(doc)
105
+ ...
106
+ >>> sum(doc["count"] for doc in loads_lines('{"count":1}\n{"count":2}\n{"count":3}\n'))
107
+ 6
108
+
109
+ Serializing multiple objects to JSON lines (newline-delimited JSON)::
110
+
111
+ >>> import simplejson as json
112
+ >>> def dumps_lines(objs):
113
+ ... for obj in objs:
114
+ ... yield json.dumps(obj, separators=(',',':')) + '\n'
115
+ ...
116
+ >>> ''.join(dumps_lines([{'count': 1}, {'count': 2}, {'count': 3}]))
117
+ '{"count":1}\n{"count":2}\n{"count":3}\n'
118
+
119
+ """
120
+ from __future__ import absolute_import
121
+ __version__ = '4.3.0'
122
+ __all__ = [
123
+ 'dump', 'dumps', 'load', 'loads',
124
+ 'JSONDecoder', 'JSONDecodeError', 'JSONEncoder',
125
+ 'OrderedDict', 'simple_first', 'RawJSON'
126
+ ]
127
+
128
+ __author__ = 'Bob Ippolito <bob@redivi.com>'
129
+
130
+ from decimal import Decimal
131
+
132
+ from .errors import JSONDecodeError
133
+ from .raw_json import RawJSON
134
+ from .decoder import JSONDecoder
135
+ from .encoder import JSONEncoder, JSONEncoderForHTML
136
+
137
+ def _import_OrderedDict():
138
+ import collections
139
+ try:
140
+ return collections.OrderedDict
141
+ except AttributeError:
142
+ from . import ordered_dict
143
+ return ordered_dict.OrderedDict
144
+ OrderedDict = _import_OrderedDict()
145
+
146
+ def _import_c_make_encoder():
147
+ try:
148
+ from ._speedups import make_encoder
149
+ return make_encoder
150
+ except ImportError:
151
+ return None
152
+
153
+ _default_encoder = JSONEncoder()
154
+
155
+ def dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True,
156
+ allow_nan=False, cls=None, indent=None, separators=None,
157
+ encoding='utf-8', default=None, use_decimal=True,
158
+ namedtuple_as_object=True, tuple_as_array=True,
159
+ bigint_as_string=False, sort_keys=False, item_sort_key=None,
160
+ for_json=False, ignore_nan=False, int_as_string_bitcount=None,
161
+ iterable_as_array=False, **kw):
162
+ """Serialize ``obj`` as a JSON formatted stream to ``fp`` (a
163
+ ``.write()``-supporting file-like object).
164
+
165
+ If *skipkeys* is true then ``dict`` keys that are not basic types
166
+ (``str``, ``int``, ``long``, ``float``, ``bool``, ``None``)
167
+ will be skipped instead of raising a ``TypeError``.
168
+
169
+ If *ensure_ascii* is false (default: ``True``), then the output may
170
+ contain non-ASCII characters, so long as they do not need to be escaped
171
+ by JSON. When it is true, all non-ASCII characters are escaped.
172
+
173
+ If *allow_nan* is true (default: ``False``), then out of range ``float``
174
+ values (``nan``, ``inf``, ``-inf``) will be serialized to
175
+ their JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``)
176
+ instead of raising a ValueError. See
177
+ *ignore_nan* for ECMA-262 compliant behavior.
178
+
179
+ If *indent* is a string, then JSON array elements and object members
180
+ will be pretty-printed with a newline followed by that string repeated
181
+ for each level of nesting. ``None`` (the default) selects the most compact
182
+ representation without any newlines.
183
+
184
+ If specified, *separators* should be an
185
+ ``(item_separator, key_separator)`` tuple. The default is ``(', ', ': ')``
186
+ if *indent* is ``None`` and ``(',', ': ')`` otherwise. To get the most
187
+ compact JSON representation, you should specify ``(',', ':')`` to eliminate
188
+ whitespace.
189
+
190
+ *encoding* is the character encoding for str instances, default is UTF-8.
191
+
192
+ *default(obj)* is a function that should return a serializable version
193
+ of obj or raise ``TypeError``. The default simply raises ``TypeError``.
194
+
195
+ If *use_decimal* is true (default: ``True``) then decimal.Decimal
196
+ will be natively serialized to JSON with full precision.
197
+
198
+ If *namedtuple_as_object* is true (default: ``True``),
199
+ :class:`tuple` subclasses with ``_asdict()`` methods will be encoded
200
+ as JSON objects.
201
+
202
+ If *tuple_as_array* is true (default: ``True``),
203
+ :class:`tuple` (and subclasses) will be encoded as JSON arrays.
204
+
205
+ If *iterable_as_array* is true (default: ``False``),
206
+ any object not in the above table that implements ``__iter__()``
207
+ will be encoded as a JSON array.
208
+
209
+ If *bigint_as_string* is true (default: ``False``), ints 2**53 and higher
210
+ or lower than -2**53 will be encoded as strings. This is to avoid the
211
+ rounding that happens in Javascript otherwise. Note that this is still a
212
+ lossy operation that will not round-trip correctly and should be used
213
+ sparingly.
214
+
215
+ If *int_as_string_bitcount* is a positive number (n), then int of size
216
+ greater than or equal to 2**n or lower than or equal to -2**n will be
217
+ encoded as strings.
218
+
219
+ If specified, *item_sort_key* is a callable used to sort the items in
220
+ each dictionary. This is useful if you want to sort items other than
221
+ in alphabetical order by key. This option takes precedence over
222
+ *sort_keys*.
223
+
224
+ If *sort_keys* is true (default: ``False``), the output of dictionaries
225
+ will be sorted by item.
226
+
227
+ If *for_json* is true (default: ``False``), objects with a ``for_json()``
228
+ method will use the return value of that method for encoding as JSON
229
+ instead of the object.
230
+
231
+ If *ignore_nan* is true (default: ``False``), then out of range
232
+ :class:`float` values (``nan``, ``inf``, ``-inf``) will be serialized as
233
+ ``null`` in compliance with the ECMA-262 specification. If true, this will
234
+ override *allow_nan*.
235
+
236
+ To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the
237
+ ``.default()`` method to serialize additional types), specify it with
238
+ the ``cls`` kwarg. NOTE: You should use *default* or *for_json* instead
239
+ of subclassing whenever possible.
240
+
241
+ """
242
+ # cached encoder
243
+ if (not skipkeys and ensure_ascii and
244
+ check_circular and not allow_nan and
245
+ cls is None and indent is None and separators is None and
246
+ encoding == 'utf-8' and default is None and use_decimal
247
+ and namedtuple_as_object and tuple_as_array and not iterable_as_array
248
+ and not bigint_as_string and not sort_keys
249
+ and item_sort_key is None and not for_json
250
+ and not ignore_nan and int_as_string_bitcount is None
251
+ and not kw
252
+ ):
253
+ iterable = _default_encoder.iterencode(obj)
254
+ else:
255
+ if cls is None:
256
+ cls = JSONEncoder
257
+ iterable = cls(skipkeys=skipkeys, ensure_ascii=ensure_ascii,
258
+ check_circular=check_circular, allow_nan=allow_nan, indent=indent,
259
+ separators=separators, encoding=encoding,
260
+ default=default, use_decimal=use_decimal,
261
+ namedtuple_as_object=namedtuple_as_object,
262
+ tuple_as_array=tuple_as_array,
263
+ iterable_as_array=iterable_as_array,
264
+ bigint_as_string=bigint_as_string,
265
+ sort_keys=sort_keys,
266
+ item_sort_key=item_sort_key,
267
+ for_json=for_json,
268
+ ignore_nan=ignore_nan,
269
+ int_as_string_bitcount=int_as_string_bitcount,
270
+ **kw).iterencode(obj)
271
+ # could accelerate with writelines in some versions of Python, at
272
+ # a debuggability cost
273
+ for chunk in iterable:
274
+ fp.write(chunk)
275
+
276
+
277
+ def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True,
278
+ allow_nan=False, cls=None, indent=None, separators=None,
279
+ encoding='utf-8', default=None, use_decimal=True,
280
+ namedtuple_as_object=True, tuple_as_array=True,
281
+ bigint_as_string=False, sort_keys=False, item_sort_key=None,
282
+ for_json=False, ignore_nan=False, int_as_string_bitcount=None,
283
+ iterable_as_array=False, **kw):
284
+ """Serialize ``obj`` to a JSON formatted ``str``.
285
+
286
+ If ``skipkeys`` is true then ``dict`` keys that are not basic types
287
+ (``str``, ``int``, ``long``, ``float``, ``bool``, ``None``)
288
+ will be skipped instead of raising a ``TypeError``.
289
+
290
+ If *ensure_ascii* is false (default: ``True``), then the output may
291
+ contain non-ASCII characters, so long as they do not need to be escaped
292
+ by JSON. When it is true, all non-ASCII characters are escaped.
293
+
294
+ If ``check_circular`` is false, then the circular reference check
295
+ for container types (including iterables encoded with
296
+ ``iterable_as_array``) will be skipped and a circular reference will
297
+ result in a ``RecursionError`` (``RuntimeError`` on Python 2) or worse.
298
+
299
+ If *allow_nan* is true (default: ``False``), then out of range ``float``
300
+ values (``nan``, ``inf``, ``-inf``) will be serialized to
301
+ their JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``)
302
+ instead of raising a ValueError. See
303
+ *ignore_nan* for ECMA-262 compliant behavior.
304
+
305
+ If ``indent`` is a string, then JSON array elements and object members
306
+ will be pretty-printed with a newline followed by that string repeated
307
+ for each level of nesting. ``None`` (the default) selects the most compact
308
+ representation without any newlines. For backwards compatibility with
309
+ versions of simplejson earlier than 2.1.0, an integer is also accepted
310
+ and is converted to a string with that many spaces.
311
+
312
+ If specified, ``separators`` should be an
313
+ ``(item_separator, key_separator)`` tuple. The default is ``(', ', ': ')``
314
+ if *indent* is ``None`` and ``(',', ': ')`` otherwise. To get the most
315
+ compact JSON representation, you should specify ``(',', ':')`` to eliminate
316
+ whitespace.
317
+
318
+ ``encoding`` is the character encoding for bytes instances, default is
319
+ UTF-8.
320
+
321
+ ``default(obj)`` is a function that should return a serializable version
322
+ of obj or raise TypeError. The default simply raises TypeError.
323
+
324
+ If *use_decimal* is true (default: ``True``) then decimal.Decimal
325
+ will be natively serialized to JSON with full precision.
326
+
327
+ If *namedtuple_as_object* is true (default: ``True``),
328
+ :class:`tuple` subclasses with ``_asdict()`` methods will be encoded
329
+ as JSON objects.
330
+
331
+ If *tuple_as_array* is true (default: ``True``),
332
+ :class:`tuple` (and subclasses) will be encoded as JSON arrays.
333
+
334
+ If *iterable_as_array* is true (default: ``False``),
335
+ any object not in the above table that implements ``__iter__()``
336
+ will be encoded as a JSON array.
337
+
338
+ If *bigint_as_string* is true (not the default), ints 2**53 and higher
339
+ or lower than -2**53 will be encoded as strings. This is to avoid the
340
+ rounding that happens in Javascript otherwise.
341
+
342
+ If *int_as_string_bitcount* is a positive number (n), then int of size
343
+ greater than or equal to 2**n or lower than or equal to -2**n will be
344
+ encoded as strings.
345
+
346
+ If specified, *item_sort_key* is a callable used to sort the items in
347
+ each dictionary. This is useful if you want to sort items other than
348
+ in alphabetical order by key. This option takes precedence over
349
+ *sort_keys*.
350
+
351
+ If *sort_keys* is true (default: ``False``), the output of dictionaries
352
+ will be sorted by item.
353
+
354
+ If *for_json* is true (default: ``False``), objects with a ``for_json()``
355
+ method will use the return value of that method for encoding as JSON
356
+ instead of the object.
357
+
358
+ If *ignore_nan* is true (default: ``False``), then out of range
359
+ :class:`float` values (``nan``, ``inf``, ``-inf``) will be serialized as
360
+ ``null`` in compliance with the ECMA-262 specification. If true, this will
361
+ override *allow_nan*.
362
+
363
+ To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the
364
+ ``.default()`` method to serialize additional types), specify it with
365
+ the ``cls`` kwarg. NOTE: You should use *default* instead of subclassing
366
+ whenever possible.
367
+
368
+ """
369
+ # cached encoder
370
+ if (not skipkeys and ensure_ascii and
371
+ check_circular and not allow_nan and
372
+ cls is None and indent is None and separators is None and
373
+ encoding == 'utf-8' and default is None and use_decimal
374
+ and namedtuple_as_object and tuple_as_array and not iterable_as_array
375
+ and not bigint_as_string and not sort_keys
376
+ and item_sort_key is None and not for_json
377
+ and not ignore_nan and int_as_string_bitcount is None
378
+ and not kw
379
+ ):
380
+ return _default_encoder.encode(obj)
381
+ if cls is None:
382
+ cls = JSONEncoder
383
+ return cls(
384
+ skipkeys=skipkeys, ensure_ascii=ensure_ascii,
385
+ check_circular=check_circular, allow_nan=allow_nan, indent=indent,
386
+ separators=separators, encoding=encoding, default=default,
387
+ use_decimal=use_decimal,
388
+ namedtuple_as_object=namedtuple_as_object,
389
+ tuple_as_array=tuple_as_array,
390
+ iterable_as_array=iterable_as_array,
391
+ bigint_as_string=bigint_as_string,
392
+ sort_keys=sort_keys,
393
+ item_sort_key=item_sort_key,
394
+ for_json=for_json,
395
+ ignore_nan=ignore_nan,
396
+ int_as_string_bitcount=int_as_string_bitcount,
397
+ **kw).encode(obj)
398
+
399
+
400
+ _default_decoder = JSONDecoder()
401
+
402
+
403
+ def load(fp, encoding=None, cls=None, object_hook=None, parse_float=None,
404
+ parse_int=None, parse_constant=None, object_pairs_hook=None,
405
+ use_decimal=False, allow_nan=False, array_hook=None, **kw):
406
+ """Deserialize ``fp`` (a ``.read()``-supporting file-like object containing
407
+ a JSON document as `str` or `bytes`) to a Python object.
408
+
409
+ *encoding* determines the encoding used to interpret any
410
+ `bytes` objects decoded by this instance (``'utf-8'`` by
411
+ default). It has no effect when decoding `str` objects.
412
+
413
+ *object_hook*, if specified, will be called with the result of every
414
+ JSON object decoded and its return value will be used in place of the
415
+ given :class:`dict`. This can be used to provide custom
416
+ deserializations (e.g. to support JSON-RPC class hinting).
417
+
418
+ *object_pairs_hook* is an optional function that will be called with
419
+ the result of any object literal decode with an ordered list of pairs.
420
+ The return value of *object_pairs_hook* will be used instead of the
421
+ :class:`dict`. This feature can be used to implement custom decoders
422
+ that rely on the order that the key and value pairs are decoded (for
423
+ example, :func:`collections.OrderedDict` will remember the order of
424
+ insertion). If *object_hook* is also defined, the *object_pairs_hook*
425
+ takes priority.
426
+
427
+ *parse_float*, if specified, will be called with the string of every
428
+ JSON float to be decoded. By default, this is equivalent to
429
+ ``float(num_str)``. This can be used to use another datatype or parser
430
+ for JSON floats (e.g. :class:`decimal.Decimal`).
431
+
432
+ *parse_int*, if specified, will be called with the string of every
433
+ JSON int to be decoded. By default, this is equivalent to
434
+ ``int(num_str)``. This can be used to use another datatype or parser
435
+ for JSON integers (e.g. :class:`float`).
436
+
437
+ *allow_nan*, if True (default false), will allow the parser to
438
+ accept the non-standard floats ``NaN``, ``Infinity``, and ``-Infinity``
439
+ and enable the use of the deprecated *parse_constant*.
440
+
441
+ If *use_decimal* is true (default: ``False``) then it implies
442
+ parse_float=decimal.Decimal for parity with ``dump``.
443
+
444
+ *parse_constant*, if specified, will be
445
+ called with one of the following strings: ``'-Infinity'``,
446
+ ``'Infinity'``, ``'NaN'``. It is not recommended to use this feature,
447
+ as it is rare to parse non-compliant JSON containing these values.
448
+
449
+ To use a custom ``JSONDecoder`` subclass, specify it with the ``cls``
450
+ kwarg. NOTE: You should use *object_hook* or *object_pairs_hook* instead
451
+ of subclassing whenever possible.
452
+
453
+ """
454
+ return loads(fp.read(),
455
+ encoding=encoding, cls=cls, object_hook=object_hook,
456
+ parse_float=parse_float, parse_int=parse_int,
457
+ parse_constant=parse_constant, object_pairs_hook=object_pairs_hook,
458
+ use_decimal=use_decimal, allow_nan=allow_nan,
459
+ array_hook=array_hook, **kw)
460
+
461
+
462
+ def loads(s, encoding=None, cls=None, object_hook=None, parse_float=None,
463
+ parse_int=None, parse_constant=None, object_pairs_hook=None,
464
+ use_decimal=False, allow_nan=False, array_hook=None, **kw):
465
+ """Deserialize ``s`` (a ``str`` or ``unicode`` instance containing a JSON
466
+ document) to a Python object.
467
+
468
+ *encoding* determines the encoding used to interpret any
469
+ :class:`bytes` objects decoded by this instance (``'utf-8'`` by
470
+ default). It has no effect when decoding :class:`unicode` objects.
471
+
472
+ *object_hook*, if specified, will be called with the result of every
473
+ JSON object decoded and its return value will be used in place of the
474
+ given :class:`dict`. This can be used to provide custom
475
+ deserializations (e.g. to support JSON-RPC class hinting).
476
+
477
+ *object_pairs_hook* is an optional function that will be called with
478
+ the result of any object literal decode with an ordered list of pairs.
479
+ The return value of *object_pairs_hook* will be used instead of the
480
+ :class:`dict`. This feature can be used to implement custom decoders
481
+ that rely on the order that the key and value pairs are decoded (for
482
+ example, :func:`collections.OrderedDict` will remember the order of
483
+ insertion). If *object_hook* is also defined, the *object_pairs_hook*
484
+ takes priority.
485
+
486
+ *parse_float*, if specified, will be called with the string of every
487
+ JSON float to be decoded. By default, this is equivalent to
488
+ ``float(num_str)``. This can be used to use another datatype or parser
489
+ for JSON floats (e.g. :class:`decimal.Decimal`).
490
+
491
+ *parse_int*, if specified, will be called with the string of every
492
+ JSON int to be decoded. By default, this is equivalent to
493
+ ``int(num_str)``. This can be used to use another datatype or parser
494
+ for JSON integers (e.g. :class:`float`).
495
+
496
+ *allow_nan*, if True (default false), will allow the parser to
497
+ accept the non-standard floats ``NaN``, ``Infinity``, and ``-Infinity``
498
+ and enable the use of the deprecated *parse_constant*.
499
+
500
+ If *use_decimal* is true (default: ``False``) then it implies
501
+ parse_float=decimal.Decimal for parity with ``dump``.
502
+
503
+ *parse_constant*, if specified, will be
504
+ called with one of the following strings: ``'-Infinity'``,
505
+ ``'Infinity'``, ``'NaN'``. It is not recommended to use this feature,
506
+ as it is rare to parse non-compliant JSON containing these values.
507
+
508
+ To use a custom ``JSONDecoder`` subclass, specify it with the ``cls``
509
+ kwarg. NOTE: You should use *object_hook* or *object_pairs_hook* instead
510
+ of subclassing whenever possible.
511
+
512
+ """
513
+ if (cls is None and encoding is None and object_hook is None and
514
+ parse_int is None and parse_float is None and
515
+ parse_constant is None and object_pairs_hook is None
516
+ and array_hook is None
517
+ and not use_decimal and not allow_nan and not kw):
518
+ return _default_decoder.decode(s)
519
+ if cls is None:
520
+ cls = JSONDecoder
521
+ if object_hook is not None:
522
+ kw['object_hook'] = object_hook
523
+ if object_pairs_hook is not None:
524
+ kw['object_pairs_hook'] = object_pairs_hook
525
+ if array_hook is not None:
526
+ kw['array_hook'] = array_hook
527
+ if parse_float is not None:
528
+ kw['parse_float'] = parse_float
529
+ if parse_int is not None:
530
+ kw['parse_int'] = parse_int
531
+ if parse_constant is not None:
532
+ kw['parse_constant'] = parse_constant
533
+ if use_decimal:
534
+ if parse_float is not None:
535
+ raise TypeError("use_decimal=True implies parse_float=Decimal")
536
+ kw['parse_float'] = Decimal
537
+ if allow_nan:
538
+ kw['allow_nan'] = True
539
+ return cls(encoding=encoding, **kw).decode(s)
540
+
541
+
542
+ def _toggle_speedups(enabled):
543
+ from . import decoder as dec
544
+ from . import encoder as enc
545
+ from . import scanner as scan
546
+ c_make_encoder = _import_c_make_encoder()
547
+ if enabled:
548
+ dec.scanstring = dec.c_scanstring or dec.py_scanstring
549
+ enc.c_make_encoder = c_make_encoder
550
+ enc.encode_basestring_ascii = (enc.c_encode_basestring_ascii or
551
+ enc.py_encode_basestring_ascii)
552
+ enc.encode_basestring = (enc.c_encode_basestring or
553
+ enc.py_encode_basestring)
554
+ scan.make_scanner = scan.c_make_scanner or scan.py_make_scanner
555
+ else:
556
+ dec.scanstring = dec.py_scanstring
557
+ enc.c_make_encoder = None
558
+ enc.encode_basestring_ascii = enc.py_encode_basestring_ascii
559
+ enc.encode_basestring = enc.py_encode_basestring
560
+ scan.make_scanner = scan.py_make_scanner
561
+ dec.make_scanner = scan.make_scanner
562
+ global _default_decoder
563
+ _default_decoder = JSONDecoder()
564
+ global _default_encoder
565
+ _default_encoder = JSONEncoder()
566
+
567
+ def simple_first(kv):
568
+ """Helper function to pass to item_sort_key to sort simple
569
+ elements to the top, then container elements.
570
+ """
571
+ return (isinstance(kv[1], (list, dict, tuple)), kv[0])
Binary file
simplejson/compat.py ADDED
@@ -0,0 +1,32 @@
1
+ """Python 3 compatibility shims
2
+ """
3
+ import sys
4
+
5
+ if sys.version_info[0] < 3:
6
+ PY3 = False
7
+ def b(s):
8
+ return s
9
+ try:
10
+ from cStringIO import StringIO
11
+ except ImportError:
12
+ from StringIO import StringIO
13
+ BytesIO = StringIO
14
+ text_type = unicode
15
+ binary_type = str
16
+ string_types = (basestring,)
17
+ integer_types = (int, long)
18
+ unichr = unichr
19
+ reload_module = reload
20
+ else:
21
+ PY3 = True
22
+ from importlib import reload as reload_module
23
+ def b(s):
24
+ return bytes(s, 'latin1')
25
+ from io import StringIO, BytesIO
26
+ text_type = str
27
+ binary_type = bytes
28
+ string_types = (str,)
29
+ integer_types = (int,)
30
+ unichr = chr
31
+
32
+ long_type = integer_types[-1]