17db96d56Sopenharmony_cir"""JSON (JavaScript Object Notation) <https://json.org> is a subset of 27db96d56Sopenharmony_ciJavaScript syntax (ECMA-262 3rd edition) used as a lightweight data 37db96d56Sopenharmony_ciinterchange format. 47db96d56Sopenharmony_ci 57db96d56Sopenharmony_ci:mod:`json` exposes an API familiar to users of the standard library 67db96d56Sopenharmony_ci:mod:`marshal` and :mod:`pickle` modules. It is derived from a 77db96d56Sopenharmony_civersion of the externally maintained simplejson library. 87db96d56Sopenharmony_ci 97db96d56Sopenharmony_ciEncoding basic Python object hierarchies:: 107db96d56Sopenharmony_ci 117db96d56Sopenharmony_ci >>> import json 127db96d56Sopenharmony_ci >>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}]) 137db96d56Sopenharmony_ci '["foo", {"bar": ["baz", null, 1.0, 2]}]' 147db96d56Sopenharmony_ci >>> print(json.dumps("\"foo\bar")) 157db96d56Sopenharmony_ci "\"foo\bar" 167db96d56Sopenharmony_ci >>> print(json.dumps('\u1234')) 177db96d56Sopenharmony_ci "\u1234" 187db96d56Sopenharmony_ci >>> print(json.dumps('\\')) 197db96d56Sopenharmony_ci "\\" 207db96d56Sopenharmony_ci >>> print(json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True)) 217db96d56Sopenharmony_ci {"a": 0, "b": 0, "c": 0} 227db96d56Sopenharmony_ci >>> from io import StringIO 237db96d56Sopenharmony_ci >>> io = StringIO() 247db96d56Sopenharmony_ci >>> json.dump(['streaming API'], io) 257db96d56Sopenharmony_ci >>> io.getvalue() 267db96d56Sopenharmony_ci '["streaming API"]' 277db96d56Sopenharmony_ci 287db96d56Sopenharmony_ciCompact encoding:: 297db96d56Sopenharmony_ci 307db96d56Sopenharmony_ci >>> import json 317db96d56Sopenharmony_ci >>> mydict = {'4': 5, '6': 7} 327db96d56Sopenharmony_ci >>> json.dumps([1,2,3,mydict], separators=(',', ':')) 337db96d56Sopenharmony_ci '[1,2,3,{"4":5,"6":7}]' 347db96d56Sopenharmony_ci 357db96d56Sopenharmony_ciPretty printing:: 367db96d56Sopenharmony_ci 377db96d56Sopenharmony_ci >>> import json 387db96d56Sopenharmony_ci >>> print(json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4)) 397db96d56Sopenharmony_ci { 407db96d56Sopenharmony_ci "4": 5, 417db96d56Sopenharmony_ci "6": 7 427db96d56Sopenharmony_ci } 437db96d56Sopenharmony_ci 447db96d56Sopenharmony_ciDecoding JSON:: 457db96d56Sopenharmony_ci 467db96d56Sopenharmony_ci >>> import json 477db96d56Sopenharmony_ci >>> obj = ['foo', {'bar': ['baz', None, 1.0, 2]}] 487db96d56Sopenharmony_ci >>> json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]') == obj 497db96d56Sopenharmony_ci True 507db96d56Sopenharmony_ci >>> json.loads('"\\"foo\\bar"') == '"foo\x08ar' 517db96d56Sopenharmony_ci True 527db96d56Sopenharmony_ci >>> from io import StringIO 537db96d56Sopenharmony_ci >>> io = StringIO('["streaming API"]') 547db96d56Sopenharmony_ci >>> json.load(io)[0] == 'streaming API' 557db96d56Sopenharmony_ci True 567db96d56Sopenharmony_ci 577db96d56Sopenharmony_ciSpecializing JSON object decoding:: 587db96d56Sopenharmony_ci 597db96d56Sopenharmony_ci >>> import json 607db96d56Sopenharmony_ci >>> def as_complex(dct): 617db96d56Sopenharmony_ci ... if '__complex__' in dct: 627db96d56Sopenharmony_ci ... return complex(dct['real'], dct['imag']) 637db96d56Sopenharmony_ci ... return dct 647db96d56Sopenharmony_ci ... 657db96d56Sopenharmony_ci >>> json.loads('{"__complex__": true, "real": 1, "imag": 2}', 667db96d56Sopenharmony_ci ... object_hook=as_complex) 677db96d56Sopenharmony_ci (1+2j) 687db96d56Sopenharmony_ci >>> from decimal import Decimal 697db96d56Sopenharmony_ci >>> json.loads('1.1', parse_float=Decimal) == Decimal('1.1') 707db96d56Sopenharmony_ci True 717db96d56Sopenharmony_ci 727db96d56Sopenharmony_ciSpecializing JSON object encoding:: 737db96d56Sopenharmony_ci 747db96d56Sopenharmony_ci >>> import json 757db96d56Sopenharmony_ci >>> def encode_complex(obj): 767db96d56Sopenharmony_ci ... if isinstance(obj, complex): 777db96d56Sopenharmony_ci ... return [obj.real, obj.imag] 787db96d56Sopenharmony_ci ... raise TypeError(f'Object of type {obj.__class__.__name__} ' 797db96d56Sopenharmony_ci ... f'is not JSON serializable') 807db96d56Sopenharmony_ci ... 817db96d56Sopenharmony_ci >>> json.dumps(2 + 1j, default=encode_complex) 827db96d56Sopenharmony_ci '[2.0, 1.0]' 837db96d56Sopenharmony_ci >>> json.JSONEncoder(default=encode_complex).encode(2 + 1j) 847db96d56Sopenharmony_ci '[2.0, 1.0]' 857db96d56Sopenharmony_ci >>> ''.join(json.JSONEncoder(default=encode_complex).iterencode(2 + 1j)) 867db96d56Sopenharmony_ci '[2.0, 1.0]' 877db96d56Sopenharmony_ci 887db96d56Sopenharmony_ci 897db96d56Sopenharmony_ciUsing json.tool from the shell to validate and pretty-print:: 907db96d56Sopenharmony_ci 917db96d56Sopenharmony_ci $ echo '{"json":"obj"}' | python -m json.tool 927db96d56Sopenharmony_ci { 937db96d56Sopenharmony_ci "json": "obj" 947db96d56Sopenharmony_ci } 957db96d56Sopenharmony_ci $ echo '{ 1.2:3.4}' | python -m json.tool 967db96d56Sopenharmony_ci Expecting property name enclosed in double quotes: line 1 column 3 (char 2) 977db96d56Sopenharmony_ci""" 987db96d56Sopenharmony_ci__version__ = '2.0.9' 997db96d56Sopenharmony_ci__all__ = [ 1007db96d56Sopenharmony_ci 'dump', 'dumps', 'load', 'loads', 1017db96d56Sopenharmony_ci 'JSONDecoder', 'JSONDecodeError', 'JSONEncoder', 1027db96d56Sopenharmony_ci] 1037db96d56Sopenharmony_ci 1047db96d56Sopenharmony_ci__author__ = 'Bob Ippolito <bob@redivi.com>' 1057db96d56Sopenharmony_ci 1067db96d56Sopenharmony_cifrom .decoder import JSONDecoder, JSONDecodeError 1077db96d56Sopenharmony_cifrom .encoder import JSONEncoder 1087db96d56Sopenharmony_ciimport codecs 1097db96d56Sopenharmony_ci 1107db96d56Sopenharmony_ci_default_encoder = JSONEncoder( 1117db96d56Sopenharmony_ci skipkeys=False, 1127db96d56Sopenharmony_ci ensure_ascii=True, 1137db96d56Sopenharmony_ci check_circular=True, 1147db96d56Sopenharmony_ci allow_nan=True, 1157db96d56Sopenharmony_ci indent=None, 1167db96d56Sopenharmony_ci separators=None, 1177db96d56Sopenharmony_ci default=None, 1187db96d56Sopenharmony_ci) 1197db96d56Sopenharmony_ci 1207db96d56Sopenharmony_cidef dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, 1217db96d56Sopenharmony_ci allow_nan=True, cls=None, indent=None, separators=None, 1227db96d56Sopenharmony_ci default=None, sort_keys=False, **kw): 1237db96d56Sopenharmony_ci """Serialize ``obj`` as a JSON formatted stream to ``fp`` (a 1247db96d56Sopenharmony_ci ``.write()``-supporting file-like object). 1257db96d56Sopenharmony_ci 1267db96d56Sopenharmony_ci If ``skipkeys`` is true then ``dict`` keys that are not basic types 1277db96d56Sopenharmony_ci (``str``, ``int``, ``float``, ``bool``, ``None``) will be skipped 1287db96d56Sopenharmony_ci instead of raising a ``TypeError``. 1297db96d56Sopenharmony_ci 1307db96d56Sopenharmony_ci If ``ensure_ascii`` is false, then the strings written to ``fp`` can 1317db96d56Sopenharmony_ci contain non-ASCII characters if they appear in strings contained in 1327db96d56Sopenharmony_ci ``obj``. Otherwise, all such characters are escaped in JSON strings. 1337db96d56Sopenharmony_ci 1347db96d56Sopenharmony_ci If ``check_circular`` is false, then the circular reference check 1357db96d56Sopenharmony_ci for container types will be skipped and a circular reference will 1367db96d56Sopenharmony_ci result in an ``RecursionError`` (or worse). 1377db96d56Sopenharmony_ci 1387db96d56Sopenharmony_ci If ``allow_nan`` is false, then it will be a ``ValueError`` to 1397db96d56Sopenharmony_ci serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``) 1407db96d56Sopenharmony_ci in strict compliance of the JSON specification, instead of using the 1417db96d56Sopenharmony_ci JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``). 1427db96d56Sopenharmony_ci 1437db96d56Sopenharmony_ci If ``indent`` is a non-negative integer, then JSON array elements and 1447db96d56Sopenharmony_ci object members will be pretty-printed with that indent level. An indent 1457db96d56Sopenharmony_ci level of 0 will only insert newlines. ``None`` is the most compact 1467db96d56Sopenharmony_ci representation. 1477db96d56Sopenharmony_ci 1487db96d56Sopenharmony_ci If specified, ``separators`` should be an ``(item_separator, key_separator)`` 1497db96d56Sopenharmony_ci tuple. The default is ``(', ', ': ')`` if *indent* is ``None`` and 1507db96d56Sopenharmony_ci ``(',', ': ')`` otherwise. To get the most compact JSON representation, 1517db96d56Sopenharmony_ci you should specify ``(',', ':')`` to eliminate whitespace. 1527db96d56Sopenharmony_ci 1537db96d56Sopenharmony_ci ``default(obj)`` is a function that should return a serializable version 1547db96d56Sopenharmony_ci of obj or raise TypeError. The default simply raises TypeError. 1557db96d56Sopenharmony_ci 1567db96d56Sopenharmony_ci If *sort_keys* is true (default: ``False``), then the output of 1577db96d56Sopenharmony_ci dictionaries will be sorted by key. 1587db96d56Sopenharmony_ci 1597db96d56Sopenharmony_ci To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the 1607db96d56Sopenharmony_ci ``.default()`` method to serialize additional types), specify it with 1617db96d56Sopenharmony_ci the ``cls`` kwarg; otherwise ``JSONEncoder`` is used. 1627db96d56Sopenharmony_ci 1637db96d56Sopenharmony_ci """ 1647db96d56Sopenharmony_ci # cached encoder 1657db96d56Sopenharmony_ci if (not skipkeys and ensure_ascii and 1667db96d56Sopenharmony_ci check_circular and allow_nan and 1677db96d56Sopenharmony_ci cls is None and indent is None and separators is None and 1687db96d56Sopenharmony_ci default is None and not sort_keys and not kw): 1697db96d56Sopenharmony_ci iterable = _default_encoder.iterencode(obj) 1707db96d56Sopenharmony_ci else: 1717db96d56Sopenharmony_ci if cls is None: 1727db96d56Sopenharmony_ci cls = JSONEncoder 1737db96d56Sopenharmony_ci iterable = cls(skipkeys=skipkeys, ensure_ascii=ensure_ascii, 1747db96d56Sopenharmony_ci check_circular=check_circular, allow_nan=allow_nan, indent=indent, 1757db96d56Sopenharmony_ci separators=separators, 1767db96d56Sopenharmony_ci default=default, sort_keys=sort_keys, **kw).iterencode(obj) 1777db96d56Sopenharmony_ci # could accelerate with writelines in some versions of Python, at 1787db96d56Sopenharmony_ci # a debuggability cost 1797db96d56Sopenharmony_ci for chunk in iterable: 1807db96d56Sopenharmony_ci fp.write(chunk) 1817db96d56Sopenharmony_ci 1827db96d56Sopenharmony_ci 1837db96d56Sopenharmony_cidef dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, 1847db96d56Sopenharmony_ci allow_nan=True, cls=None, indent=None, separators=None, 1857db96d56Sopenharmony_ci default=None, sort_keys=False, **kw): 1867db96d56Sopenharmony_ci """Serialize ``obj`` to a JSON formatted ``str``. 1877db96d56Sopenharmony_ci 1887db96d56Sopenharmony_ci If ``skipkeys`` is true then ``dict`` keys that are not basic types 1897db96d56Sopenharmony_ci (``str``, ``int``, ``float``, ``bool``, ``None``) will be skipped 1907db96d56Sopenharmony_ci instead of raising a ``TypeError``. 1917db96d56Sopenharmony_ci 1927db96d56Sopenharmony_ci If ``ensure_ascii`` is false, then the return value can contain non-ASCII 1937db96d56Sopenharmony_ci characters if they appear in strings contained in ``obj``. Otherwise, all 1947db96d56Sopenharmony_ci such characters are escaped in JSON strings. 1957db96d56Sopenharmony_ci 1967db96d56Sopenharmony_ci If ``check_circular`` is false, then the circular reference check 1977db96d56Sopenharmony_ci for container types will be skipped and a circular reference will 1987db96d56Sopenharmony_ci result in an ``RecursionError`` (or worse). 1997db96d56Sopenharmony_ci 2007db96d56Sopenharmony_ci If ``allow_nan`` is false, then it will be a ``ValueError`` to 2017db96d56Sopenharmony_ci serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``) in 2027db96d56Sopenharmony_ci strict compliance of the JSON specification, instead of using the 2037db96d56Sopenharmony_ci JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``). 2047db96d56Sopenharmony_ci 2057db96d56Sopenharmony_ci If ``indent`` is a non-negative integer, then JSON array elements and 2067db96d56Sopenharmony_ci object members will be pretty-printed with that indent level. An indent 2077db96d56Sopenharmony_ci level of 0 will only insert newlines. ``None`` is the most compact 2087db96d56Sopenharmony_ci representation. 2097db96d56Sopenharmony_ci 2107db96d56Sopenharmony_ci If specified, ``separators`` should be an ``(item_separator, key_separator)`` 2117db96d56Sopenharmony_ci tuple. The default is ``(', ', ': ')`` if *indent* is ``None`` and 2127db96d56Sopenharmony_ci ``(',', ': ')`` otherwise. To get the most compact JSON representation, 2137db96d56Sopenharmony_ci you should specify ``(',', ':')`` to eliminate whitespace. 2147db96d56Sopenharmony_ci 2157db96d56Sopenharmony_ci ``default(obj)`` is a function that should return a serializable version 2167db96d56Sopenharmony_ci of obj or raise TypeError. The default simply raises TypeError. 2177db96d56Sopenharmony_ci 2187db96d56Sopenharmony_ci If *sort_keys* is true (default: ``False``), then the output of 2197db96d56Sopenharmony_ci dictionaries will be sorted by key. 2207db96d56Sopenharmony_ci 2217db96d56Sopenharmony_ci To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the 2227db96d56Sopenharmony_ci ``.default()`` method to serialize additional types), specify it with 2237db96d56Sopenharmony_ci the ``cls`` kwarg; otherwise ``JSONEncoder`` is used. 2247db96d56Sopenharmony_ci 2257db96d56Sopenharmony_ci """ 2267db96d56Sopenharmony_ci # cached encoder 2277db96d56Sopenharmony_ci if (not skipkeys and ensure_ascii and 2287db96d56Sopenharmony_ci check_circular and allow_nan and 2297db96d56Sopenharmony_ci cls is None and indent is None and separators is None and 2307db96d56Sopenharmony_ci default is None and not sort_keys and not kw): 2317db96d56Sopenharmony_ci return _default_encoder.encode(obj) 2327db96d56Sopenharmony_ci if cls is None: 2337db96d56Sopenharmony_ci cls = JSONEncoder 2347db96d56Sopenharmony_ci return cls( 2357db96d56Sopenharmony_ci skipkeys=skipkeys, ensure_ascii=ensure_ascii, 2367db96d56Sopenharmony_ci check_circular=check_circular, allow_nan=allow_nan, indent=indent, 2377db96d56Sopenharmony_ci separators=separators, default=default, sort_keys=sort_keys, 2387db96d56Sopenharmony_ci **kw).encode(obj) 2397db96d56Sopenharmony_ci 2407db96d56Sopenharmony_ci 2417db96d56Sopenharmony_ci_default_decoder = JSONDecoder(object_hook=None, object_pairs_hook=None) 2427db96d56Sopenharmony_ci 2437db96d56Sopenharmony_ci 2447db96d56Sopenharmony_cidef detect_encoding(b): 2457db96d56Sopenharmony_ci bstartswith = b.startswith 2467db96d56Sopenharmony_ci if bstartswith((codecs.BOM_UTF32_BE, codecs.BOM_UTF32_LE)): 2477db96d56Sopenharmony_ci return 'utf-32' 2487db96d56Sopenharmony_ci if bstartswith((codecs.BOM_UTF16_BE, codecs.BOM_UTF16_LE)): 2497db96d56Sopenharmony_ci return 'utf-16' 2507db96d56Sopenharmony_ci if bstartswith(codecs.BOM_UTF8): 2517db96d56Sopenharmony_ci return 'utf-8-sig' 2527db96d56Sopenharmony_ci 2537db96d56Sopenharmony_ci if len(b) >= 4: 2547db96d56Sopenharmony_ci if not b[0]: 2557db96d56Sopenharmony_ci # 00 00 -- -- - utf-32-be 2567db96d56Sopenharmony_ci # 00 XX -- -- - utf-16-be 2577db96d56Sopenharmony_ci return 'utf-16-be' if b[1] else 'utf-32-be' 2587db96d56Sopenharmony_ci if not b[1]: 2597db96d56Sopenharmony_ci # XX 00 00 00 - utf-32-le 2607db96d56Sopenharmony_ci # XX 00 00 XX - utf-16-le 2617db96d56Sopenharmony_ci # XX 00 XX -- - utf-16-le 2627db96d56Sopenharmony_ci return 'utf-16-le' if b[2] or b[3] else 'utf-32-le' 2637db96d56Sopenharmony_ci elif len(b) == 2: 2647db96d56Sopenharmony_ci if not b[0]: 2657db96d56Sopenharmony_ci # 00 XX - utf-16-be 2667db96d56Sopenharmony_ci return 'utf-16-be' 2677db96d56Sopenharmony_ci if not b[1]: 2687db96d56Sopenharmony_ci # XX 00 - utf-16-le 2697db96d56Sopenharmony_ci return 'utf-16-le' 2707db96d56Sopenharmony_ci # default 2717db96d56Sopenharmony_ci return 'utf-8' 2727db96d56Sopenharmony_ci 2737db96d56Sopenharmony_ci 2747db96d56Sopenharmony_cidef load(fp, *, cls=None, object_hook=None, parse_float=None, 2757db96d56Sopenharmony_ci parse_int=None, parse_constant=None, object_pairs_hook=None, **kw): 2767db96d56Sopenharmony_ci """Deserialize ``fp`` (a ``.read()``-supporting file-like object containing 2777db96d56Sopenharmony_ci a JSON document) to a Python object. 2787db96d56Sopenharmony_ci 2797db96d56Sopenharmony_ci ``object_hook`` is an optional function that will be called with the 2807db96d56Sopenharmony_ci result of any object literal decode (a ``dict``). The return value of 2817db96d56Sopenharmony_ci ``object_hook`` will be used instead of the ``dict``. This feature 2827db96d56Sopenharmony_ci can be used to implement custom decoders (e.g. JSON-RPC class hinting). 2837db96d56Sopenharmony_ci 2847db96d56Sopenharmony_ci ``object_pairs_hook`` is an optional function that will be called with the 2857db96d56Sopenharmony_ci result of any object literal decoded with an ordered list of pairs. The 2867db96d56Sopenharmony_ci return value of ``object_pairs_hook`` will be used instead of the ``dict``. 2877db96d56Sopenharmony_ci This feature can be used to implement custom decoders. If ``object_hook`` 2887db96d56Sopenharmony_ci is also defined, the ``object_pairs_hook`` takes priority. 2897db96d56Sopenharmony_ci 2907db96d56Sopenharmony_ci To use a custom ``JSONDecoder`` subclass, specify it with the ``cls`` 2917db96d56Sopenharmony_ci kwarg; otherwise ``JSONDecoder`` is used. 2927db96d56Sopenharmony_ci """ 2937db96d56Sopenharmony_ci return loads(fp.read(), 2947db96d56Sopenharmony_ci cls=cls, object_hook=object_hook, 2957db96d56Sopenharmony_ci parse_float=parse_float, parse_int=parse_int, 2967db96d56Sopenharmony_ci parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw) 2977db96d56Sopenharmony_ci 2987db96d56Sopenharmony_ci 2997db96d56Sopenharmony_cidef loads(s, *, cls=None, object_hook=None, parse_float=None, 3007db96d56Sopenharmony_ci parse_int=None, parse_constant=None, object_pairs_hook=None, **kw): 3017db96d56Sopenharmony_ci """Deserialize ``s`` (a ``str``, ``bytes`` or ``bytearray`` instance 3027db96d56Sopenharmony_ci containing a JSON document) to a Python object. 3037db96d56Sopenharmony_ci 3047db96d56Sopenharmony_ci ``object_hook`` is an optional function that will be called with the 3057db96d56Sopenharmony_ci result of any object literal decode (a ``dict``). The return value of 3067db96d56Sopenharmony_ci ``object_hook`` will be used instead of the ``dict``. This feature 3077db96d56Sopenharmony_ci can be used to implement custom decoders (e.g. JSON-RPC class hinting). 3087db96d56Sopenharmony_ci 3097db96d56Sopenharmony_ci ``object_pairs_hook`` is an optional function that will be called with the 3107db96d56Sopenharmony_ci result of any object literal decoded with an ordered list of pairs. The 3117db96d56Sopenharmony_ci return value of ``object_pairs_hook`` will be used instead of the ``dict``. 3127db96d56Sopenharmony_ci This feature can be used to implement custom decoders. If ``object_hook`` 3137db96d56Sopenharmony_ci is also defined, the ``object_pairs_hook`` takes priority. 3147db96d56Sopenharmony_ci 3157db96d56Sopenharmony_ci ``parse_float``, if specified, will be called with the string 3167db96d56Sopenharmony_ci of every JSON float to be decoded. By default this is equivalent to 3177db96d56Sopenharmony_ci float(num_str). This can be used to use another datatype or parser 3187db96d56Sopenharmony_ci for JSON floats (e.g. decimal.Decimal). 3197db96d56Sopenharmony_ci 3207db96d56Sopenharmony_ci ``parse_int``, if specified, will be called with the string 3217db96d56Sopenharmony_ci of every JSON int to be decoded. By default this is equivalent to 3227db96d56Sopenharmony_ci int(num_str). This can be used to use another datatype or parser 3237db96d56Sopenharmony_ci for JSON integers (e.g. float). 3247db96d56Sopenharmony_ci 3257db96d56Sopenharmony_ci ``parse_constant``, if specified, will be called with one of the 3267db96d56Sopenharmony_ci following strings: -Infinity, Infinity, NaN. 3277db96d56Sopenharmony_ci This can be used to raise an exception if invalid JSON numbers 3287db96d56Sopenharmony_ci are encountered. 3297db96d56Sopenharmony_ci 3307db96d56Sopenharmony_ci To use a custom ``JSONDecoder`` subclass, specify it with the ``cls`` 3317db96d56Sopenharmony_ci kwarg; otherwise ``JSONDecoder`` is used. 3327db96d56Sopenharmony_ci """ 3337db96d56Sopenharmony_ci if isinstance(s, str): 3347db96d56Sopenharmony_ci if s.startswith('\ufeff'): 3357db96d56Sopenharmony_ci raise JSONDecodeError("Unexpected UTF-8 BOM (decode using utf-8-sig)", 3367db96d56Sopenharmony_ci s, 0) 3377db96d56Sopenharmony_ci else: 3387db96d56Sopenharmony_ci if not isinstance(s, (bytes, bytearray)): 3397db96d56Sopenharmony_ci raise TypeError(f'the JSON object must be str, bytes or bytearray, ' 3407db96d56Sopenharmony_ci f'not {s.__class__.__name__}') 3417db96d56Sopenharmony_ci s = s.decode(detect_encoding(s), 'surrogatepass') 3427db96d56Sopenharmony_ci 3437db96d56Sopenharmony_ci if (cls is None and object_hook is None and 3447db96d56Sopenharmony_ci parse_int is None and parse_float is None and 3457db96d56Sopenharmony_ci parse_constant is None and object_pairs_hook is None and not kw): 3467db96d56Sopenharmony_ci return _default_decoder.decode(s) 3477db96d56Sopenharmony_ci if cls is None: 3487db96d56Sopenharmony_ci cls = JSONDecoder 3497db96d56Sopenharmony_ci if object_hook is not None: 3507db96d56Sopenharmony_ci kw['object_hook'] = object_hook 3517db96d56Sopenharmony_ci if object_pairs_hook is not None: 3527db96d56Sopenharmony_ci kw['object_pairs_hook'] = object_pairs_hook 3537db96d56Sopenharmony_ci if parse_float is not None: 3547db96d56Sopenharmony_ci kw['parse_float'] = parse_float 3557db96d56Sopenharmony_ci if parse_int is not None: 3567db96d56Sopenharmony_ci kw['parse_int'] = parse_int 3577db96d56Sopenharmony_ci if parse_constant is not None: 3587db96d56Sopenharmony_ci kw['parse_constant'] = parse_constant 3597db96d56Sopenharmony_ci return cls(**kw).decode(s) 360