json.py 908 B

12345678910111213141516171819202122232425262728293031
  1. import json
  2. import numbers
  3. import numpy as np
  4. class SafeFallbackEncoder(json.JSONEncoder):
  5. def __init__(self, nan_str="null", **kwargs):
  6. super(SafeFallbackEncoder, self).__init__(**kwargs)
  7. self.nan_str = nan_str
  8. def default(self, value):
  9. try:
  10. if type(value).__module__ == np.__name__ and isinstance(value, np.ndarray):
  11. return value.tolist()
  12. if isinstance(value, np.bool_):
  13. return bool(value)
  14. if np.isnan(value):
  15. return self.nan_str
  16. if issubclass(type(value), numbers.Integral):
  17. return int(value)
  18. if issubclass(type(value), numbers.Number):
  19. return float(value)
  20. return super(SafeFallbackEncoder, self).default(value)
  21. except Exception:
  22. return str(value) # give up, just stringify it (ok for logs)