json_encoder.py 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. # -*- coding: utf-8 -*-
  2. """自定义 JSON 编码器。
  3. 按 ARCHITECTURE.md Phase 3 拆分建议,从 ``common/Utils.py`` 迁出。
  4. 类型:RULE FRAMEWORK(可由 AI 起草,必须人工维护)。
  5. 原位置:``common/Utils.py`` 第 87-102 行。
  6. ``common/Utils.py`` 仍 re-export ``MyEncoder``,老 import 不受影响。
  7. """
  8. from __future__ import absolute_import
  9. import json
  10. try:
  11. import numpy as np
  12. except ImportError: # pragma: no cover
  13. np = None
  14. __all__ = ["MyEncoder"]
  15. class MyEncoder(json.JSONEncoder):
  16. """支持 numpy ndarray / scalar / bytes 的 JSON 编码器。"""
  17. def __init__(self):
  18. import numpy as _np
  19. global np
  20. np = _np
  21. def default(self, obj):
  22. if isinstance(obj, np.ndarray):
  23. return obj.tolist()
  24. elif isinstance(obj, bytes):
  25. return str(obj, encoding='utf-8')
  26. elif isinstance(obj, (np.float_, np.float16, np.float32,
  27. np.float64)):
  28. return float(obj)
  29. elif isinstance(obj, (np.int64, np.int32)):
  30. return int(obj)
  31. return json.JSONEncoder.default(self, obj)