Coverage for mindsdb / utilities / json_encoder.py: 90%
28 statements
« prev ^ index » next coverage.py v7.13.1, created at 2026-01-21 00:36 +0000
« prev ^ index » next coverage.py v7.13.1, created at 2026-01-21 00:36 +0000
1from datetime import datetime, date, timedelta
2from decimal import Decimal
3import pandas as pd
4import numpy as np
5import orjson
6from flask.json.provider import DefaultJSONProvider
9class CustomJSONEncoder:
10 def default(self, obj):
11 if isinstance(obj, timedelta):
12 return str(obj)
13 if isinstance(obj, datetime):
14 return obj.strftime("%Y-%m-%d %H:%M:%S.%f")
15 if isinstance(obj, date):
16 return obj.strftime("%Y-%m-%d")
17 if isinstance(obj, Decimal):
18 return float(obj)
19 if isinstance(obj, np.bool_): 19 ↛ 20line 19 didn't jump to line 20 because the condition on line 19 was never true
20 return bool(obj)
21 if isinstance(obj, np.ndarray):
22 return obj.tolist()
23 if pd.isnull(obj): 23 ↛ 26line 23 didn't jump to line 26 because the condition on line 23 was always true
24 return None
26 return str(obj)
29class ORJSONProvider(DefaultJSONProvider):
30 """
31 Use orjson to serialize data instead of flask json provider.
32 """
34 def dumps(self, obj, **kwargs):
35 return orjson.dumps(
36 obj,
37 option=(
38 orjson.OPT_SERIALIZE_NUMPY
39 | orjson.OPT_NON_STR_KEYS
40 # keep this for using CustomJSON encoder
41 | orjson.OPT_PASSTHROUGH_DATETIME
42 ),
43 default=CustomJSONEncoder().default,
44 ).decode("utf-8")
46 def loads(self, s, **kwargs):
47 return orjson.loads(s)