Source code for pytest_experiments.json_tools
from typing import Any
import json
from .config import TYPE_KEY, DATA_KEY, SKIP_UNKNOWN_JSON_TYPES, TYPE_MAPPINGS
from .common import type_name_of, any_are_none
[docs]def json_serializer(obj: dict) -> str:
"""Serialize an object to a JSON string."""
return TypeDispatchedJSONEncoder().encode(obj)
[docs]def json_deserializer(s: str) -> dict:
"""Deserialize an object from a JSON string."""
return json.loads(s, object_hook=object_hook)
[docs]class TypeDispatchedJSONEncoder(json.JSONEncoder):
def __init__(
self, *, skip_unknown_types=SKIP_UNKNOWN_JSON_TYPES, **kwargs
):
super().__init__(**kwargs)
self._skip_unknown_types = skip_unknown_types
[docs] def default(self, o: Any) -> Any:
typename = type_name_of(o)
encoder, _ = TYPE_MAPPINGS.get(typename, (None, None))
if encoder is not None:
return {TYPE_KEY: typename, DATA_KEY: encoder(o)}
if self._skip_unknown_types:
return None
return super().default(o)
[docs]def object_hook(obj: dict) -> dict:
"""Deserializes custom json objects."""
typename = obj.get(TYPE_KEY, None)
if typename is None:
return obj
data = obj.get(DATA_KEY, None)
_, decoder = TYPE_MAPPINGS.get(typename, (None, None))
if not any_are_none(data, decoder):
data = decoder(data)
return data