我们在Python的json.JSONEncoder类
中可以查看Python数据序列化为JSON格式的数据时数据类型的对应关系:
class JSONEncoder(object):
"""Extensible JSON <http://json.org> encoder for Python data structures.
Supports the following objects and types by default:
+-------------------+---------------+
| Python | JSON |
+===================+===============+
| dict | object |
+-------------------+---------------+
| list, tuple | array |
+-------------------+---------------+
| str | string |
+-------------------+---------------+
| int, float | number |
+-------------------+---------------+
| True | true |
+-------------------+---------------+
| False | false |
+-------------------+---------------+
| None | null |
+-------------------+---------------+
pass
# 其他方法省略
但是实际中我们也经常会遇到不能直接进行JSON序列化的Python数据,比如说datetime
与Decimal
类型的数据,这时就需要我们先把这两种格式的数据转换为Python的str
,然后再进行JSON序列化操作。
datetime类型数据的处理
我们在进行json.dumps()
操作的时候可以指定进行序列化的类:
import json
from datetime import datetime
from datetime import date
#对含有日期格式数据的json数据进行转换
class JsonCustomEncoder(json.JSONEncoder):
def default(self, field):
if isinstance(field,datetime):
return field.strftime('%Y-%m-%d %H:%M:%S')
elif isinstance(field,date):
return field.strftime('%Y-%m-%d')
else:
return json.JSONEncoder.default(self,field)
d1 = datetime.now()
dd = json.dumps(d1,cls=JsonCustomEncoder)
print(dd)
其实,本质上还是利用了strftime
方法:
from datetime import datetime
i = datetime.strftime(i,'%Y-%m-%d')
Decimal类型数据的处理
对于Decimal
类型的数据我们可以利用Python的decimal模块
先将其转为str
:
import decimal
price = str(decimal.Decimal(price).quantize(decimal.Decimal('0.00')))
然后把得到的结果再进行序列化即可。