responses.py 678 B

1234567891011121314151617181920212223
  1. import json
  2. import math
  3. from fastapi.responses import JSONResponse
  4. def _sanitize(obj):
  5. """Replace NaN/Infinity with None so every payload remains valid JSON."""
  6. if isinstance(obj, float):
  7. if math.isnan(obj) or math.isinf(obj):
  8. return None
  9. if isinstance(obj, dict):
  10. return {k: _sanitize(v) for k, v in obj.items()}
  11. if isinstance(obj, list):
  12. return [_sanitize(i) for i in obj]
  13. return obj
  14. class SafeJSONResponse(JSONResponse):
  15. """JSONResponse variant that normalizes non-JSON float values."""
  16. def render(self, content) -> bytes:
  17. return json.dumps(_sanitize(content), ensure_ascii=False).encode("utf-8")