Source code for tradeexecutor.webhook.json_helper

import json
import math
from datetime import datetime, timedelta
from decimal import Decimal
from enum import Enum
from typing import Collection, Mapping
from uuid import UUID

import pandas as pd
from dataclasses_json.core import Json
from dataclasses_json.utils import _isinstance_safe


[docs]class NaNToNullEncoder(json.JSONEncoder): """NaN fixed dataclasses-json JSON encoder"""
[docs] def default(self, o) -> Json: """NaN + timedelta added""" result: Json if _isinstance_safe(o, Collection): if _isinstance_safe(o, Mapping): result = dict(o) else: result = list(o) elif _isinstance_safe(o, datetime): result = o.timestamp() elif _isinstance_safe(o, UUID): result = str(o) elif _isinstance_safe(o, Enum): result = o.value elif _isinstance_safe(o, Decimal): result = str(o) elif _isinstance_safe(o, timedelta): result = o.total_seconds() elif _isinstance_safe(o, pd.Timedelta): result = o.total_seconds() else: result = json.JSONEncoder.default(self, o) return result
[docs] def encode(self, obj): # Replace NaN/Inf before encoding return super().encode(self._sanitize(obj))
def _sanitize(self, obj): if isinstance(obj, float): if math.isnan(obj) or math.isinf(obj): return None elif isinstance(obj, dict): return {k: self._sanitize(v) for k, v in obj.items()} elif isinstance(obj, list): return [self._sanitize(v) for v in obj] return obj