mirror of
https://github.com/bottlesdevs/Bottles.git
synced 2026-10-19 07:21:25 +08:00
8e12f6d0de
Co-authored-by: EmoonX <emoon@emoon.dev>
66 lines
2.0 KiB
Python
66 lines
2.0 KiB
Python
"""This should be a drop-in replacement for the json module built in CPython"""
|
|
|
|
import json
|
|
import json as _json
|
|
from typing import IO, Any
|
|
|
|
from bottles.backend.models.config import DictCompatMixIn
|
|
|
|
JSONDecodeError = json.JSONDecodeError
|
|
|
|
|
|
class ExtJSONEncoder(_json.JSONEncoder):
|
|
def default(self, o):
|
|
if isinstance(o, DictCompatMixIn):
|
|
return o.json_serialize_handler(o)
|
|
return super().default(o)
|
|
|
|
|
|
def load(fp: IO[str]) -> Any:
|
|
"""Deserialize fp (a .read()-supporting file-like object containing a JSON document) to a Python object."""
|
|
return _json.load(fp)
|
|
|
|
|
|
def loads(s: str | bytes) -> Any:
|
|
"""Deserialize s (a str, bytes or bytearray instance containing a JSON document) to a Python object."""
|
|
return _json.loads(s)
|
|
|
|
|
|
def dump(
|
|
obj: Any,
|
|
fp: IO[str],
|
|
*,
|
|
indent: str | int | None = None,
|
|
cls: type[_json.JSONEncoder] | None = None,
|
|
) -> None:
|
|
"""
|
|
Serialize obj as a JSON formatted stream to fp (a .write()-supporting file-like object).
|
|
|
|
:param obj: the object you want to serialize
|
|
:param fp: the file-like object you want to write
|
|
:param indent: `None` for compact output, `0` for newline only, non-negative integer for indent level
|
|
:param cls: Custom JsonEncoder subclass, use ExtJsonEncoder if not provided
|
|
"""
|
|
if cls is None: # replace default JsonEncoder
|
|
cls = ExtJSONEncoder
|
|
return _json.dump(obj, fp, indent=indent, cls=cls)
|
|
|
|
|
|
def dumps(
|
|
obj: Any,
|
|
*,
|
|
indent: str | int | None = None,
|
|
cls: type[_json.JSONEncoder] | None = None,
|
|
) -> str:
|
|
"""
|
|
Serialize obj to a JSON formatted str.
|
|
|
|
:param obj: the object you want to serialize
|
|
:param indent: `None` for compact output, `0` for newline only, non-negative integer for indent level
|
|
:param cls: Custom JsonEncoder subclass, use ExtJsonEncoder if not provided
|
|
:return: serialized result
|
|
"""
|
|
if cls is None: # replace default JsonEncoder
|
|
cls = ExtJSONEncoder
|
|
return _json.dumps(obj, indent=indent, cls=cls)
|