天道酬勤,学无止境

datetime.date(2014, 4, 25) 在 Django 中不是 JSON 可序列化的 [重复](datetime.date(2014, 4, 25) is not JSON serializable in Django [duplicate])

问题

编辑

这个问题不是如何克服“datetime.datetime not JSON serializable”的重复问题? 因为,虽然这是同一个问题,但它提供了一个特定的上下文:Django。 因此,有一些解决方案适用于此处,但不适用于提供的链接问题。


原问题

我遵循如何克服“datetime.datetime not JSON serializable”? 但这无济于事

我试过这个代码

>>> import datetime
>>> a =datetime.date(2014, 4, 25)
>>> from bson import json_util
>>> b = json.dumps(a,default = json_util.default)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/lib/python2.7/json/__init__.py", line 250, in dumps
    sort_keys=sort_keys, **kw).encode(obj)
  File "/usr/lib/python2.7/json/encoder.py", line 207, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python2.7/json/encoder.py", line 270, in iterencode
    return _iterencode(o, 0)
  File "/home/.../python2.7/site-packages/bson/json_util.py", line 256, in default
    raise TypeError("%r is not JSON serializable" % obj)
TypeError: datetime.date(2014, 4, 25) is not JSON serializable

有人可以帮助我使用datetime.date序列化器和反序列化器。

回答1

你也可以这样做:

def date_handler(obj):
    return obj.isoformat() if hasattr(obj, 'isoformat') else obj

print json.dumps(data, default=date_handler)

从这里。

根据 JFSebastian 评论更新

def date_handler(obj):
    if hasattr(obj, 'isoformat'):
        return obj.isoformat()
    else:
        raise TypeError

print json.dumps(data, default=date_handler)
回答2

将日期转换为等效的iso格式,

In [29]: datetime.datetime.now().isoformat()
Out[29]: '2020-03-06T12:18:54.114600'
回答3

请参阅 json 包文档 https://docs.python.org/2/library/json.html 中的扩展编码器部分

我使用过这种方法,发现它非常有效。 我想这就是你要找的。

import json
class DatetimeEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            return obj.strftime('%Y-%m-%dT%H:%M:%SZ')
        elif isinstance(obj, date):
            return obj.strftime('%Y-%m-%d')
        # Let the base class default method raise the TypeError
        return json.JSONEncoder.default(self, obj)

json.dumps(dict,cls=DatetimeEncoder)
回答4

您可以在处理模型查询集时将日期时间编码器添加到 JSON 跳转函数中,这是自定义的,因为我在解析基本 django 模型状态时遇到了问题

import datetime
import decimal
from django.db.models.base import ModelState

class DateTimeEncoder(json.JSONEncoder):
    def default(self, obj):
       if hasattr(obj, 'isoformat'):
           return obj.isoformat()
       elif isinstance(obj, decimal.Decimal):
           return float(obj)
       elif isinstance(obj, ModelState):
           return None
       else:
           return json.JSONEncoder.default(self, obj)

然后将此类与您的 json 转储一起使用

b = json.dumps(a, cls = DateTimeEncoder)
回答5

我发现这非常宝贵,尤其是在将 Django 从 1.7 更新到 1.9 之后。 其中大部分来自博客 http://arthurpemberton.com/2015/04/fixing-uuid-is-not-json-serializable 将其放在 models.py 中,就在导入的正下方。 它也会为您处理 UUID。

from uuid import UUID
import datetime
JSONEncoder_olddefault = JSONEncoder.default
def JSONEncoder_newdefault(self, o):
    if isinstance(o, UUID): return str(o)
    if isinstance(o, datetime.datetime): return str(o)
    return JSONEncoder_olddefault(self, o)
JSONEncoder.default = JSONEncoder_newdefault

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何克服“ datetime.datetime无法JSON序列化”?(How to overcome “datetime.datetime not JSON serializable”?)
    问题 我有一个基本的命令,如下所示: sample = {} sample['title'] = "String" sample['somedate'] = somedatetimehere 当我尝试执行jsonify(sample)我得到: TypeError: datetime.datetime(2012, 8, 8, 21, 46, 24, 862000) is not JSON serializable 我该怎么做才能使我的字典示例可以克服上述错误? 注意:尽管可能不相关,但是字典是从mongodb中检索记录生成的,在我打印出str(sample['somedate']) ,输出为2012-08-08 21:46:24.862000 。 回答1 于2018年更新 原始答案适应了MongoDB“日期”字段表示为: {"$date": 1506816000000} 如果您想要将datetime时间序列化为json的通用Python解决方案,请查看@jjmontes的答案以获取无需依赖项的快速解决方案。 当您使用mongoengine(每个注释)并且pymongo是一个依赖项时,pymongo具有内置的实用程序来帮助json序列化: http://api.mongodb.org/python/1.10.1/api/bson/json_util.html 用法示例(序列化):
  • Django搭建的疫情数据可视化
    目录 摘要 3.2数据可视化 3.2.1疫情地图 3.2.2趋势图 3.3部署django 3.3.1创建项目、app 3.3.2编写urls.py 3.3.3编写views.py 3.3.4编写html文件 3.3.5包含一些js、css文件 4.1疫情地图 4.2疫情趋势图 摘要 搭建基于Django框架的前后端系统,后端的主要功能为获取数据、保存数据、可视化数据,将可视化内容合成成网页;客户端通过浏览器访问,查看疫情地图、疫情趋势图。后端软件从相关网站获取每日最新的疫情数据,对数据进行正则化处理,提取需要的疫情数据,保存为json格式的文件;调用可视化模块pyechart,制作成可视化内容;编写响应的html文件,达到数据可视化的目的。 1.引言 2020年以来,我们国家爆发传染性新冠肺炎重大卫生事件,此次重大的卫生事件影响了全国人民的日常、经济生活。疫情的严重性严重危害人们的健康,后期世界各国不断爆发传染性新冠肺炎疫情。疫情期间,大家最关心的就是疫情数据,每日关注的就是新增数据数量。单一的数据对于人的警告作用非常有限,对于不同地区的情况了解甚少,缺乏全局局势的认知。疫情数据可视化结合了地区图例、疫情数据,生动、形象、具体地展示了数据与自身相关地区的关系,利于人们充分意识到疫情的严重性。 2.系统结构。 图1 系统框架图 2.1 django Django 是一个由
  • datetime.date(2014, 4, 25) is not JSON serializable in Django [duplicate]
    This question already has answers here: How to overcome “datetime.datetime not JSON serializable”? (32 answers) Closed 5 years ago. EDIT This question is not a duplicate of How to overcome "datetime.datetime not JSON serializable"? Because, although this is the same problem, it provides a specific context: Django. And so, there are some solutions that apply here and that do not apply on the provided link's question. ORIGINAL QUESTION I followed How to overcome "datetime.datetime not JSON serializable"? but this is not helping I tried this code >>> import datetime >>> a =datetime.date(2014, 4
  • 如何在Python中获取当前时间(How to get the current time in Python)
    问题 获取当前时间的模块/方法是什么? 回答1 采用: >>> import datetime >>> datetime.datetime.now() datetime.datetime(2009, 1, 6, 15, 8, 24, 78915) >>> print(datetime.datetime.now()) 2009-01-06 15:08:24.789150 而只是时间: >>> datetime.datetime.now().time() datetime.time(15, 8, 24, 78915) >>> print(datetime.datetime.now().time()) 15:08:24.789150 有关更多信息,请参见文档。 要保存类型,可以从datetime模块导入datetime对象: >>> from datetime import datetime 然后删除前导datetime. 以上所有。 回答2 您可以使用time.strftime(): >>> from time import gmtime, strftime >>> strftime("%Y-%m-%d %H:%M:%S", gmtime()) '2009-01-05 22:14:39' 回答3 from datetime import datetime datetime.now()
  • 在日期上过滤Pandas DataFrames(Filtering Pandas DataFrames on dates)
    问题 我有一个带有“日期”列的Pandas DataFrame。 现在,我需要过滤掉DataFrame中日期在接下来两个月之外的所有行。 本质上,我只需要保留接下来两个月内的行。 实现此目标的最佳方法是什么? 回答1 如果date列是索引,则将.loc用于基于标签的索引,将.iloc用于位置索引。 例如: df.loc['2014-01-01':'2014-02-01'] 在此处查看详细信息http://pandas.pydata.org/pandas-docs/stable/dsintro.html#indexing-selection 如果列不是索引,则有两个选择: 使其成为索引(如果是时间序列数据,则为临时索引或永久索引) df[(df['date'] > '2013-01-01') & (df['date'] < '2013-02-01')] 有关一般说明,请参见此处 注意:不推荐使用.ix。 回答2 根据我的经验,上一个答案是不正确的,您不能将其传递为简单的字符串,而必须将其作为日期时间对象。 所以: import datetime df.loc[datetime.date(year=2014,month=1,day=1):datetime.date(year=2014,month=2,day=1)] 回答3 而且,如果通过导入datetime包对日期进行了标准化
  • 在每个类中使用不同的格式序列化同一类中的多个DateTime属性(Serializing multiple DateTime properties in the same class using different formats for each one)
    问题 我有一个带有两个DateTime属性的类。 我需要使用不同的格式序列化每个属性。 我该怎么做? 我试过: JsonConvert.SerializeObject(obj, Formatting.None, new IsoDateTimeConverter {DateTimeFormat = "MM.dd.yyyy"}); 该解决方案对我不起作用,因为它将日期格式应用于所有属性。 有什么方法可以序列化具有不同格式的每个DateTime属性? 也许有一些属性? 回答1 NewtonSoft.Json的结构有点难以理解,您可以使用类似以下自定义转换器的方法来执行所需的操作: [TestMethod] public void Conversion() { var obj = new DualDate() { DateOne = new DateTime(2013, 07, 25), DateTwo = new DateTime(2013, 07, 25) }; Assert.AreEqual("{\"DateOne\":\"07.25.2013\",\"DateTwo\":\"2013-07-25T00:00:00\"}", JsonConvert.SerializeObject(obj, Formatting.None, new DualDateJsonConverter()))
  • Google App Engine模型的JSON序列化(JSON serialization of Google App Engine models)
    问题 我已经搜索了很长时间,但没有成功。 我的项目未使用Django,是否有一种简单的方法可以将App Engine模型(google.appengine.ext.db.Model)序列化为JSON,还是需要编写自己的序列化程序? 模型: class Photo(db.Model): filename = db.StringProperty() title = db.StringProperty() description = db.StringProperty(multiline=True) date_taken = db.DateTimeProperty() date_uploaded = db.DateTimeProperty(auto_now_add=True) album = db.ReferenceProperty(Album, collection_name='photo') 回答1 一个简单的递归函数可用于将一个实体(和任何引用对象)转换为可传递给simplejson的嵌套字典: import datetime import time SIMPLE_TYPES = (int, long, float, bool, dict, basestring, list) def to_dict(model): output = {} for key, prop in
  • python(八)——递归,排序,模块
    递归,排序,模块 递归递归应用 排序模块re模块time模块 日期格式的%datetime模块random模块random模块应用: os模块os模块应用 sys模块序列化模块模块的导入详解 递归 一种直接或间接自身调用自身的过程 必须设定递归程序的出口 递归次数过多会报错,超过递归最大深度(一般不超过1000次,可以自己设置) 递归会使代码变得简洁,但效率极低 import sys sys.setrecursionlimit(10000)设置递归深度 递归次数过多就不要用递归,会消耗大量内存 递归应用 斐波那契数列 #斐波那契数列 def fib(n): if n == 0 or n == 1: return 1,1 a,b = fib(n-1) return b,a+b print(fib(5))#(5, 8) 每次返回两个值 ,只需要返回一个值的话,可以设计一个标记值,每深入一层递归,值加1,每往上一层-1,当标记值为0,即为最外层,返回一个值即可 阶乘 #阶乘 3! = 3 * 2 * 1 def f(n): if n == 1: return 1 return n * f(n-1) print(f(3))#6 排序 冒泡排序 #冒泡排序 l = [36,45,79,12,31,54,47,25,15,55,74] length = len(l) for i in
  • TypeError:ObjectId('')不可序列化JSON(TypeError: ObjectId('') is not JSON serializable)
    问题 My response back from MongoDB after querying an aggregated function on document using Python, It returns valid response and i can print it but can not return it. Error: TypeError: ObjectId('51948e86c25f4b1d1c0d303c') is not JSON serializable Print: {'result': [{'_id': ObjectId('51948e86c25f4b1d1c0d303c'), 'api_calls_with_key': 4, 'api_calls_per_day': 0.375, 'api_calls_total': 6, 'api_calls_without_key': 2}], 'ok': 1.0} But When i try to return: TypeError: ObjectId('51948e86c25f4b1d1c0d303c') is not JSON serializable It is RESTfull call: @appv1.route('/v1/analytics') def get_api_analytics()
  • 在Flask中为SQLAlchemy结果集jsonify [重复](jsonify a SQLAlchemy result set in Flask [duplicate])
    问题 这个问题已经在这里有了答案: 如何将SqlAlchemy结果序列化为JSON? (29个答案) 2年前关闭。 我正在尝试对Flask / Python中的SQLAlchemy结果集进行json化。 Flask邮件列表建议使用以下方法http://librelist.com/browser//flask/2011/2/16/jsonify-sqlalchemy-pagination-collection-result/#04a0754b63387f87e59dda564bde426e: return jsonify(json_list = qryresult) 但是我得到以下错误: TypeError: <flaskext.sqlalchemy.BaseQuery object at 0x102c2df90> is not JSON serializable 我在这里俯瞰什么? 我发现了这个问题:如何将SqlAlchemy结果序列化为JSON? 看起来非常相似,但是我不知道Flask是否具有某些使魔术变得更容易的魔术,如邮件列表中所建议的那样。 编辑:为澄清起见,这就是我的模型的样子 class Rating(db.Model): __tablename__ = 'rating' id = db.Column(db.Integer, primary_key=True)
  • 将Django模型对象转换为所有字段均完整的dict(Convert Django Model object to dict with all of the fields intact)
    问题 如何将Django模型对象及其所有字段转换为字典? 理想情况下,所有内容都应包含外键和具有editable = False的字段。 让我详细说明。 假设我有一个django模型,如下所示: from django.db import models class OtherModel(models.Model): pass class SomeModel(models.Model): normal_value = models.IntegerField() readonly_value = models.IntegerField(editable=False) auto_now_add = models.DateTimeField(auto_now_add=True) foreign_key = models.ForeignKey(OtherModel, related_name="ref1") many_to_many = models.ManyToManyField(OtherModel, related_name="ref2") 在终端中,我已执行以下操作: other_model = OtherModel() other_model.save() instance = SomeModel() instance.normal_value = 1 instance
  • Python strftime-日期前无0?(Python strftime - date without leading 0?)
    问题 使用Python strftime ,有一种方法可以删除日期的第一个0(如果它在第10个之前),即。 所以01是1 ? 找不到%东西吗? 谢谢! 回答1 实际上,我遇到了同样的问题,并且我意识到,如果在%和字母之间添加连字符,则可以删除前导零。 例如%Y/%-m/%-d 。 这仅适用于Unix(Linux,OS X),而不适用于Windows(包括Cygwin)。 在Windows上,您将使用# ,例如%Y/%#m/%#d 。 回答2 从python2.6开始,随着format方法的出现,我们可以做这种事情: >>> import datetime >>> '{dt.year}/{dt.month}/{dt.day}'.format(dt = datetime.datetime.now()) '2013/4/19' 尽管可能超出了原始问题的范围,但是对于更有趣的格式,您可以执行以下操作: >>> '{dt:%A} {dt:%B} {dt.day}, {dt.year}'.format(dt=datetime.datetime.now()) 'Wednesday December 3, 2014' 从python3.6开始,这可以表示为内联格式的字符串: Python 3.6.0a2 (v3.6.0a2:378893423552, Jun 13 2016, 14:44:21)
  • Python JSON序列化Decimal对象(Python JSON serialize a Decimal object)
    问题 我有一个Decimal('3.9')作为对象的一部分,并希望将其编码为一个看起来像{'x': 3.9}的JSON字符串。 我不在乎客户端的精度,因此浮点数很好。 有一个很好的方法来序列化此吗? JSONDecoder不接受Decimal对象,并且事先转换为float会产生{'x': 3.8999999999999999} ,这是错误的,并且会浪费大量带宽。 回答1 子类化json.JSONEncoder怎么json.JSONEncoder ? class DecimalEncoder(json.JSONEncoder): def default(self, o): if isinstance(o, decimal.Decimal): # wanted a simple yield str(o) in the next line, # but that would mean a yield on the line with super(...), # which wouldn't work (see my comment below), so... return (str(o) for o in [o]) return super(DecimalEncoder, self).default(o) 然后像这样使用它: json.dumps({'x': decimal
  • 如何在Spring MVC中使用带有Jackson 2 Client的Jackson来反序列化Joda DateTime?(How to deserialize Joda DateTime using Jackson with Jersey 2 Client in Spring MVC?)
    问题 一段时间以来,我一直在用这种概念验证来打击自己的头。 我想使用一个REST端点,该端点返回具有ISO8601 UTC时间戳记的JSON有效负载: { ... "timestamp" : "2014-08-20T11:51:31.233Z" } 我想使用通过Jackson / Spring Boot编写为Jersey 2客户端的命令行Java客户端来使用它。 编组POJO的定义如下: @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(Include.NON_NULL) public class GreetingResource { @JsonProperty("timestamp") private DateTime date; ... } 遵循以下建议后,显示在: https://jersey.java.net/documentation/latest/user-guide.html#json.jackson 并使用以下Gradle依赖项: dependencies { compile("org.springframework.boot:spring-boot-starter") compile("org.springframework.boot:spring-boot-starter-logging")
  • 计算两个日期之间月份的差异(calculating the difference in months between two dates)
    问题 在C#/。NET中, TimeSpan具有TotalDays , TotalMinutes等等,但是我无法计算出总月差的公式。 每月变化的日子和leap年不断让我失望。 如何获得TotalMonths ? 抱歉,不清楚,请编辑Edit :我知道我实际上无法从TimeSpan获得此信息,但我认为使用TotalDays和TotalMinutes可以很好地表达我的期望……只是我想获取Total Months 。 例如:2009年12月25日-2009年10月6日= 2 TotalMonths。 10月6日至11月5日等于0个月。 1月11日,1个月。 12月6日,2个月 回答1 您将无法从TimeSpan获得该值,因为“月”是可变的度量单位。 您必须自己计算它,并且必须弄清楚您希望它如何工作。 例如,像July 5, 2009和July 5, 2009 August 4, 2009产生一个月或零个月的差异? 如果您说应该产生一,那么July 31, 2009和July 31, 2009 August 1, 2009呢? 那是一个月吗? 仅仅是日期的Month值之差,还是与实际时间跨度更相关? 确定所有这些规则的逻辑很重要,因此您必须确定自己的规则并实施适当的算法。 如果您想要的只是月份中的不同(完全不考虑日期值),则可以使用以下方法: public static int
  • Python和JavaScript之间的JSON日期时间(JSON datetime between Python and JavaScript)
    问题 我想使用JSON从Python发送序列化形式的datetime.datetime对象,并使用JSON在JavaScript中反序列化。 做这个的最好方式是什么? 回答1 您可以在json.dumps中添加“默认”参数来处理此问题: date_handler = lambda obj: ( obj.isoformat() if isinstance(obj, (datetime.datetime, datetime.date)) else None ) json.dumps(datetime.datetime.now(), default=date_handler) '"2010-04-20T20:08:21.634121"' 这是ISO 8601格式。 更全面的默认处理程序功能: def handler(obj): if hasattr(obj, 'isoformat'): return obj.isoformat() elif isinstance(obj, ...): return ... else: raise TypeError, 'Object of type %s with value of %s is not JSON serializable' % (type(obj), repr(obj)) 更新:添加了类型和值的输出。 更新:还处理日期 回答2
  • 如何解析ISO 8601格式的日期?(How do I parse an ISO 8601-formatted date?)
    问题 我需要将RFC 3339字符串(如"2008-09-03T20:56:35.450686Z"解析为Python的datetime类型。 我在Python标准库中找到了strptime,但这不是很方便。 做这个的最好方式是什么? 回答1 python-dateutil包不仅可以解析RFC 3339日期时间字符串(例如问题中的字符串),还可以解析其他不符合RFC 3339的ISO 8601日期和时间字符串(例如不具有UTC偏移量的字符串或代表仅一个日期)。 >>> import dateutil.parser >>> dateutil.parser.isoparse('2008-09-03T20:56:35.450686Z') # RFC 3339 format datetime.datetime(2008, 9, 3, 20, 56, 35, 450686, tzinfo=tzutc()) >>> dateutil.parser.isoparse('2008-09-03T20:56:35.450686') # ISO 8601 extended format datetime.datetime(2008, 9, 3, 20, 56, 35, 450686) >>> dateutil.parser.isoparse('20080903T205635.450686') # ISO
  • 如何使可序列化的JSON类(How to make a class JSON serializable)
    问题 如何使Python类可序列化? 一个简单的类: class FileItem: def __init__(self, fname): self.fname = fname 我应该怎么做才能获得以下输出: >>> import json >>> my_file = FileItem('/foo/bar') >>> json.dumps(my_file) TypeError: Object of type 'FileItem' is not JSON serializable 没有错误 回答1 您对预期的输出有想法吗? 例如,这样做吗? >>> f = FileItem("/foo/bar") >>> magic(f) '{"fname": "/foo/bar"}' 在这种情况下,您只能调用json.dumps(f.__dict__) 。 如果您想要更多的自定义输出,那么您将必须继承JSONEncoder并实现您自己的自定义序列化。 有关一个简单的示例,请参见下文。 >>> from json import JSONEncoder >>> class MyEncoder(JSONEncoder): def default(self, o): return o.__dict__ >>> MyEncoder().encode(f) '{"fname": "/foo/bar"}' 然后
  • 如何获取Web API OData v4以使用DateTime(How to get Web API OData v4 to use DateTime)
    问题 我有一个相当大的数据模型,我想使用OData V4协议使用Web API OData公开。 基础数据存储在SQL Server 2012数据库中。 该数据库中有许多DateTime列。 当我进行连接时,出现一个错误,提示不支持System.DateTime。 所以这是我的问题,如何使我的DateTime列在OData提要中显示? 注意:我无法返回并将所有列更改为DateTimeOffset列。 我尝试在Entity Framework edmx中更改列的类型,但这给了我这个错误: 指定的成员映射无效。 类型'MyProject.MyEntity'中成员'MyPropertyHere'的类型'Edm.DateTimeOffset [Nullable = False,DefaultValue =,Precision =]'与'SqlServer.datetime [Nullable = False,DefaultValue =,Precision = 3]不兼容成员“ MyColumnName”的类型为“ MyDataModel.Store.MyEntity”。 (特别是说DateTime与DateTimeOffset不兼容。) Web API OData团队是否真的将所有需要使用SQL Server类型的DateTime人都排除在外了? 更新:我已经找到了解决方法
  • AppEngine使NDB模型JSON可序列化(AppEngine Making ndb models json serializable)
    问题 我们有一个ndb模型,我们想使json可序列化。 这些模型非常简单,遵循以下原则: class Pasta(ndb.Model): name = ndb.StringProperty() type = ndb.StringProperty() comments = ndb.JsonProperty() 然后在处理程序方面,我们希望按照以下方式进行操作: json.dumps(Pasta.query(Pasta.name=="Ravioli").fetch())并将其返回给客户端,但由于类Pasta不能序列化JSON,它始终会抛出json解析错误。 因此,问题是,我们是否必须实现__str__或__repr__还是有一种更__repr__方法呢? 回答1 ndb.Model实例具有to_dict()函数:https://developers.google.com/appengine/docs/python/ndb/modelclass#Model_to_dict 最简单的方法是: json.dumps([p.to_dict() for p in Pasta.query(Pasta.name == "Ravioli").fetch()]) 回答2 我不相信有任何文档,但是对于现有的ext.db模型,您可以使用db.to_dict() (请参见此处)。 但是请谨慎使用db