出于某种原因,jsonify
功能正在将我的datetime.date
转换为似乎是HTTP日期的内容。使用yyyy-mm-dd
时如何以jsonify
格式保留日期?
test_date = datetime.date(2017, 4, 27)
print(test_date) # 2017-04-27
test_date_jsonify = jsonify(test_date)
print(test_date_jsonify.get_data(as_text=True)) # Thu, 27 Apr 2017 00:00:00 GMT
根据评论中的建议,使用jsonify(str(test_date))
会返回所需的格式。但是,请考虑以下情况:
test_dict = {"name": "name1", "date":datetime.date(2017, 4, 27)}
print(test_dict) # {"name": "name1", "date":datetime.date(2017, 4, 27)}
test_dict_jsonify = jsonify(test_dict)
print(test_dict_jsonify.get_data(as_text=True)) # {"date": "Thu, 27 Apr 2017 00:00:00 GMT", "name": "name1"}
test_dict_jsonify = jsonify(str(test_dict))
print(test_dict_jsonify.get_data(as_text=True)) # "{"date": datetime.date(2017, 4, 27), "name": "name1"}"
在这种情况下,str()
解决方案不起作用。
答案 0 :(得分:19)
关注this snippet,您可以这样做:
from flask.json import JSONEncoder
from datetime import date
class CustomJSONEncoder(JSONEncoder):
def default(self, obj):
try:
if isinstance(obj, date):
return obj.isoformat()
iterable = iter(obj)
except TypeError:
pass
else:
return list(iterable)
return JSONEncoder.default(self, obj)
app = Flask(__name__)
app.json_encoder = CustomJSONEncoder
路线:
import datetime as dt
@app.route('/', methods=['GET'])
def index():
now = dt.datetime.now()
return jsonify({'now': now})
答案 1 :(得分:9)
datetime.date
不是JSON类型,因此默认情况下不可序列化。相反,Flask添加了一个钩子来将日期转储为RFC 1123格式的字符串,这与HTTP请求和响应的其他部分中的日期一致。
如果要更改格式,请使用自定义JSON编码器。子类JSONEncoder
并将Flask.json_encoder
设置为它。
from flask import Flask
from flask.json import JSONEncoder
class MyJSONEncoder(JSONEncoder):
def default(self, o):
if isinstance(o, date):
return o.isoformat()
return super().default(o)
class MyFlask(Flask):
json_encoder = MyJSONEncoder
app = MyFlask(__name__)
使用ISO 8601传输和存储值是个好主意。它可以由JavaScript Date.parse
(和其他解析器)明确地解析。输出时选择输出格式,而不是存储时。
表示RFC 2822或ISO 8601日期的字符串(可以使用其他格式,但结果可能是意外的)。
当你加载数据时,无法知道该值是一个日期而不是一个字符串(因为日期不是JSON类型),所以你没有得到datetime.date
,你得到一个字符串。 (如果你确实得到了约会,那么如何知道返回date
而不是datetime
?)
答案 2 :(得分:1)
您可以更改your app's .json_encoder
attribute,实施JSONEncoder
的变体,根据您的需要格式化日期。