171 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			171 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Python
		
	
	
	
from __future__ import annotations
 | 
						|
 | 
						|
import json as _json
 | 
						|
import typing as t
 | 
						|
 | 
						|
from ..globals import current_app
 | 
						|
from .provider import _default
 | 
						|
 | 
						|
if t.TYPE_CHECKING:  # pragma: no cover
 | 
						|
    from ..wrappers import Response
 | 
						|
 | 
						|
 | 
						|
def dumps(obj: t.Any, **kwargs: t.Any) -> str:
 | 
						|
    """Serialize data as JSON.
 | 
						|
 | 
						|
    If :data:`~flask.current_app` is available, it will use its
 | 
						|
    :meth:`app.json.dumps() <flask.json.provider.JSONProvider.dumps>`
 | 
						|
    method, otherwise it will use :func:`json.dumps`.
 | 
						|
 | 
						|
    :param obj: The data to serialize.
 | 
						|
    :param kwargs: Arguments passed to the ``dumps`` implementation.
 | 
						|
 | 
						|
    .. versionchanged:: 2.3
 | 
						|
        The ``app`` parameter was removed.
 | 
						|
 | 
						|
    .. versionchanged:: 2.2
 | 
						|
        Calls ``current_app.json.dumps``, allowing an app to override
 | 
						|
        the behavior.
 | 
						|
 | 
						|
    .. versionchanged:: 2.0.2
 | 
						|
        :class:`decimal.Decimal` is supported by converting to a string.
 | 
						|
 | 
						|
    .. versionchanged:: 2.0
 | 
						|
        ``encoding`` will be removed in Flask 2.1.
 | 
						|
 | 
						|
    .. versionchanged:: 1.0.3
 | 
						|
        ``app`` can be passed directly, rather than requiring an app
 | 
						|
        context for configuration.
 | 
						|
    """
 | 
						|
    if current_app:
 | 
						|
        return current_app.json.dumps(obj, **kwargs)
 | 
						|
 | 
						|
    kwargs.setdefault("default", _default)
 | 
						|
    return _json.dumps(obj, **kwargs)
 | 
						|
 | 
						|
 | 
						|
def dump(obj: t.Any, fp: t.IO[str], **kwargs: t.Any) -> None:
 | 
						|
    """Serialize data as JSON and write to a file.
 | 
						|
 | 
						|
    If :data:`~flask.current_app` is available, it will use its
 | 
						|
    :meth:`app.json.dump() <flask.json.provider.JSONProvider.dump>`
 | 
						|
    method, otherwise it will use :func:`json.dump`.
 | 
						|
 | 
						|
    :param obj: The data to serialize.
 | 
						|
    :param fp: A file opened for writing text. Should use the UTF-8
 | 
						|
        encoding to be valid JSON.
 | 
						|
    :param kwargs: Arguments passed to the ``dump`` implementation.
 | 
						|
 | 
						|
    .. versionchanged:: 2.3
 | 
						|
        The ``app`` parameter was removed.
 | 
						|
 | 
						|
    .. versionchanged:: 2.2
 | 
						|
        Calls ``current_app.json.dump``, allowing an app to override
 | 
						|
        the behavior.
 | 
						|
 | 
						|
    .. versionchanged:: 2.0
 | 
						|
        Writing to a binary file, and the ``encoding`` argument, will be
 | 
						|
        removed in Flask 2.1.
 | 
						|
    """
 | 
						|
    if current_app:
 | 
						|
        current_app.json.dump(obj, fp, **kwargs)
 | 
						|
    else:
 | 
						|
        kwargs.setdefault("default", _default)
 | 
						|
        _json.dump(obj, fp, **kwargs)
 | 
						|
 | 
						|
 | 
						|
def loads(s: str | bytes, **kwargs: t.Any) -> t.Any:
 | 
						|
    """Deserialize data as JSON.
 | 
						|
 | 
						|
    If :data:`~flask.current_app` is available, it will use its
 | 
						|
    :meth:`app.json.loads() <flask.json.provider.JSONProvider.loads>`
 | 
						|
    method, otherwise it will use :func:`json.loads`.
 | 
						|
 | 
						|
    :param s: Text or UTF-8 bytes.
 | 
						|
    :param kwargs: Arguments passed to the ``loads`` implementation.
 | 
						|
 | 
						|
    .. versionchanged:: 2.3
 | 
						|
        The ``app`` parameter was removed.
 | 
						|
 | 
						|
    .. versionchanged:: 2.2
 | 
						|
        Calls ``current_app.json.loads``, allowing an app to override
 | 
						|
        the behavior.
 | 
						|
 | 
						|
    .. versionchanged:: 2.0
 | 
						|
        ``encoding`` will be removed in Flask 2.1. The data must be a
 | 
						|
        string or UTF-8 bytes.
 | 
						|
 | 
						|
    .. versionchanged:: 1.0.3
 | 
						|
        ``app`` can be passed directly, rather than requiring an app
 | 
						|
        context for configuration.
 | 
						|
    """
 | 
						|
    if current_app:
 | 
						|
        return current_app.json.loads(s, **kwargs)
 | 
						|
 | 
						|
    return _json.loads(s, **kwargs)
 | 
						|
 | 
						|
 | 
						|
def load(fp: t.IO[t.AnyStr], **kwargs: t.Any) -> t.Any:
 | 
						|
    """Deserialize data as JSON read from a file.
 | 
						|
 | 
						|
    If :data:`~flask.current_app` is available, it will use its
 | 
						|
    :meth:`app.json.load() <flask.json.provider.JSONProvider.load>`
 | 
						|
    method, otherwise it will use :func:`json.load`.
 | 
						|
 | 
						|
    :param fp: A file opened for reading text or UTF-8 bytes.
 | 
						|
    :param kwargs: Arguments passed to the ``load`` implementation.
 | 
						|
 | 
						|
    .. versionchanged:: 2.3
 | 
						|
        The ``app`` parameter was removed.
 | 
						|
 | 
						|
    .. versionchanged:: 2.2
 | 
						|
        Calls ``current_app.json.load``, allowing an app to override
 | 
						|
        the behavior.
 | 
						|
 | 
						|
    .. versionchanged:: 2.2
 | 
						|
        The ``app`` parameter will be removed in Flask 2.3.
 | 
						|
 | 
						|
    .. versionchanged:: 2.0
 | 
						|
        ``encoding`` will be removed in Flask 2.1. The file must be text
 | 
						|
        mode, or binary mode with UTF-8 bytes.
 | 
						|
    """
 | 
						|
    if current_app:
 | 
						|
        return current_app.json.load(fp, **kwargs)
 | 
						|
 | 
						|
    return _json.load(fp, **kwargs)
 | 
						|
 | 
						|
 | 
						|
def jsonify(*args: t.Any, **kwargs: t.Any) -> Response:
 | 
						|
    """Serialize the given arguments as JSON, and return a
 | 
						|
    :class:`~flask.Response` object with the ``application/json``
 | 
						|
    mimetype. A dict or list returned from a view will be converted to a
 | 
						|
    JSON response automatically without needing to call this.
 | 
						|
 | 
						|
    This requires an active request or application context, and calls
 | 
						|
    :meth:`app.json.response() <flask.json.provider.JSONProvider.response>`.
 | 
						|
 | 
						|
    In debug mode, the output is formatted with indentation to make it
 | 
						|
    easier to read. This may also be controlled by the provider.
 | 
						|
 | 
						|
    Either positional or keyword arguments can be given, not both.
 | 
						|
    If no arguments are given, ``None`` is serialized.
 | 
						|
 | 
						|
    :param args: A single value to serialize, or multiple values to
 | 
						|
        treat as a list to serialize.
 | 
						|
    :param kwargs: Treat as a dict to serialize.
 | 
						|
 | 
						|
    .. versionchanged:: 2.2
 | 
						|
        Calls ``current_app.json.response``, allowing an app to override
 | 
						|
        the behavior.
 | 
						|
 | 
						|
    .. versionchanged:: 2.0.2
 | 
						|
        :class:`decimal.Decimal` is supported by converting to a string.
 | 
						|
 | 
						|
    .. versionchanged:: 0.11
 | 
						|
        Added support for serializing top-level arrays. This was a
 | 
						|
        security risk in ancient browsers. See :ref:`security-json`.
 | 
						|
 | 
						|
    .. versionadded:: 0.2
 | 
						|
    """
 | 
						|
    return current_app.json.response(*args, **kwargs)  # type: ignore[return-value]
 |