json 序列化
首先得强调的是 json 的两种格式
{key: value} : json 对象
[{}, {}, {}] : json 数组
Python 原始类型向 json 类型的转化情况如下:
Python 对象 | json 对象 |
---|---|
dict | object |
list、tuple | array |
str、 unicode | string |
int、 long、float | number |
True/False | true/false |
None | null |
json 知道如何处理 list、dict、tuple、string等对象,但它无法序列化它不知道的类型(比如date、datetime、Decimal、以及自定义的class等),如果需要序列化的话,那么就需要自定义序列化方法,例如自定义一个序列化 date/datetime/Decimal 类型的方法:
import json
from decimal import Decimal
from datetime import date, datetime
class CustomJSONEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.strftime('%Y-%m-%d %H:%M:%S')
elif isinstance(obj, date):
return obj.strftime('%Y-%m-%d')
elif isinstance(obj, Decimal):
return float(obj)
else:
return json.JSONEncoder.default(self, obj)
那么在使用 json.dumps 序列化时只需要指定自定义的方法即可:
json.dumps(datalist, cls=CustomJSONEncoder)
json.dumps 与 flask 中的 jsonify 区别
1、在返回json接口数据时也可以考虑使用 json.dumps ,这个时候就是选择纯原生的写法(自己造轮子),需要自己处理的点就比较多
# 需要自己处理返回状态,类型等等
return json.dumps(data), 200, {"Content-Type":"application/json"}
2、jsonify 也是封装的 json.dumps ,只不过加了一些返回的类型,状态等等
# 传入dict形式
return jsonify({'name': name, 'words': words})
# 传入key=value形式的参数
jsonify(name=name,words=words)
网友评论