我們在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')))
然后把得到的結果再進行序列化即可。
