JSONEncoder

Bases: JSONEncoder

Custom JSON encoder that extends the default JSONEncoder to handle additional types such as OpenAPIModel instances, dataclasses, Enums, UUIDs, and various NumPy and pandas types.

Source code in src/alpha/encoder.py
class JSONEncoder(encoder.JSONEncoder):
    """Custom JSON encoder that extends the default JSONEncoder to handle
    additional types such as OpenAPIModel instances, dataclasses, Enums, UUIDs,
    and various NumPy and pandas types.
    """

    include_nulls = False

    def default(self, o: Any) -> Any:
        """Custom JSON encoder method for handling additional types.

        Parameters
        ----------
        o
            The object to encode.

        Returns
        -------
        Any
            The JSON-serializable representation of the object.
        """
        if isinstance(o, list):
            return [self.default(item) for item in o]  # type: ignore
        if isinstance(o, OpenAPIModel):
            dikt: dict[str, Any] = {}
            for attr, _ in six.iteritems(o.openapi_types):
                value = getattr(o, attr)
                if value is None and not self.include_nulls:
                    continue
                attr = o.attribute_map[attr]
                dikt[attr] = value
            return dikt
        if hasattr(o, "to_dict"):
            return o.to_dict()
        if hasattr(o, "to_list"):
            return o.to_list()
        if isinstance(o, set):
            return list(o)  # type: ignore
        if isinstance(o, Enum):
            return o.name
        if isinstance(o, UUID):
            return str(o)
        if isinstance(o, np.int64):  # type: ignore
            return int(o)
        if isinstance(o, np.float32):  # type: ignore
            return float(o)
        if isinstance(o, pd.Timestamp):
            return o.isoformat()
        if isinstance(o, datetime):
            return o.isoformat()
        if isinstance(o, date):
            return o.isoformat()
        if isinstance(o, time):
            return o.isoformat()
        if isinstance(o, type):
            cls = getattr(o, "__name__", None)
            return cls if cls is not None else str(o)
        if is_dataclass(o):
            return asdict(o)  # type: ignore
        if is_attrs(o):
            return attrs_asdict(o)
        if is_pydantic(o):
            return o.model_dump()

        try:
            return json.JSONEncoder.default(self, o)
        except Exception:
            return None

Methods:

default

default(o)

Custom JSON encoder method for handling additional types.

Parameters:
  • o (Any) –

    The object to encode.

Returns:
  • Any

    The JSON-serializable representation of the object.

Source code in src/alpha/encoder.py
def default(self, o: Any) -> Any:
    """Custom JSON encoder method for handling additional types.

    Parameters
    ----------
    o
        The object to encode.

    Returns
    -------
    Any
        The JSON-serializable representation of the object.
    """
    if isinstance(o, list):
        return [self.default(item) for item in o]  # type: ignore
    if isinstance(o, OpenAPIModel):
        dikt: dict[str, Any] = {}
        for attr, _ in six.iteritems(o.openapi_types):
            value = getattr(o, attr)
            if value is None and not self.include_nulls:
                continue
            attr = o.attribute_map[attr]
            dikt[attr] = value
        return dikt
    if hasattr(o, "to_dict"):
        return o.to_dict()
    if hasattr(o, "to_list"):
        return o.to_list()
    if isinstance(o, set):
        return list(o)  # type: ignore
    if isinstance(o, Enum):
        return o.name
    if isinstance(o, UUID):
        return str(o)
    if isinstance(o, np.int64):  # type: ignore
        return int(o)
    if isinstance(o, np.float32):  # type: ignore
        return float(o)
    if isinstance(o, pd.Timestamp):
        return o.isoformat()
    if isinstance(o, datetime):
        return o.isoformat()
    if isinstance(o, date):
        return o.isoformat()
    if isinstance(o, time):
        return o.isoformat()
    if isinstance(o, type):
        cls = getattr(o, "__name__", None)
        return cls if cls is not None else str(o)
    if is_dataclass(o):
        return asdict(o)  # type: ignore
    if is_attrs(o):
        return attrs_asdict(o)
    if is_pydantic(o):
        return o.model_dump()

    try:
        return json.JSONEncoder.default(self, o)
    except Exception:
        return None