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