Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在';yyyy-mm-dd';使用烧瓶时的格式';s jsonify_Python_Json_Date_Datetime_Flask - Fatal编程技术网

Python 在';yyyy-mm-dd';使用烧瓶时的格式';s jsonify

Python 在';yyyy-mm-dd';使用烧瓶时的格式';s jsonify,python,json,date,datetime,flask,Python,Json,Date,Datetime,Flask,出于某种原因,jsonify函数正在将我的datetime.date转换为一个HTTP日期。使用jsonify时,如何将日期保持为yyyy-mm-dd格式 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

出于某种原因,
jsonify
函数正在将我的
datetime.date
转换为一个HTTP日期。使用
jsonify
时,如何将日期保持为
yyyy-mm-dd
格式

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()

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})

datetime.date
不是JSON类型,因此默认情况下不可序列化。相反,Flask添加了一个钩子,将日期转储到格式为的字符串中,这与HTTP请求和响应的其他部分中的日期一致

如果要更改格式,请使用自定义JSON编码器。子类并设置为它

使用它来传输和存储值是一个好主意。JavaScript(和其他解析器)可以毫不含糊地解析它。在输出时选择输出格式,而不是在存储时选择

表示RFC 2822或ISO 8601日期的字符串(可以使用其他格式,但结果可能是意外的)


加载数据时,无法知道该值是日期而不是字符串(因为日期不是JSON类型),因此不会得到
datetime.date
back,而是字符串。(如果你确实得到了一个日期,它怎么知道返回
date
而不是
datetime
?)

将它序列化为字符串?我真的不明白你的意思。
jsonify(str(test_date))
当你打印一个对象时,会调用对象的
\uu str_u
方法,所以你看到的就是这个。如果这就是您想要序列化和反序列化的内容,请在对象上调用
str()
。这很有效,谢谢。然而,我认为我犯了一个错误,将我正在处理的案件过于简单化。通常,当我jsonifDateTime.date时,它与其他元素一起是dict的一部分,在这种情况下,这种方法不起作用。我已经更新了我的问题,以便更好地说明我正在处理的案件。你能详细说明审判的必要性吗。。。除了与另一个更简单的答案相比,else block?@MaxNoe:在回顾更简单的方法时,我认为额外的检查并不是真正必要的,因为——如图所示——简单地检查date的实例应该有效。谢谢你的评论。
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__)