33 lines
1 KiB
Python
33 lines
1 KiB
Python
import json
|
|
from types import SimpleNamespace
|
|
|
|
|
|
class JsonSize:
|
|
@staticmethod
|
|
def _safe_default(o):
|
|
from datetime import datetime, date
|
|
from decimal import Decimal
|
|
|
|
if isinstance(o, (datetime, date)):
|
|
return o.isoformat()
|
|
if isinstance(o, Decimal):
|
|
return float(o)
|
|
if isinstance(o, SimpleNamespace):
|
|
return vars(o)
|
|
if hasattr(o, "__dict__"):
|
|
return vars(o)
|
|
return str(o)
|
|
|
|
def __new__(cls, obj):
|
|
try:
|
|
# 💡 ensure_ascii=False mantém acentos; surrogatepass evita falha com caracteres inválidos
|
|
json_str = json.dumps(
|
|
obj,
|
|
ensure_ascii=False,
|
|
default=cls._safe_default,
|
|
)
|
|
# 💡 errors='ignore' ou 'replace' evita que .encode() quebre
|
|
return len(json_str.encode("utf-8", errors="ignore"))
|
|
except Exception:
|
|
# fallback de segurança (nunca deve quebrar)
|
|
return len(str(obj).encode("utf-8", errors="ignore"))
|