Lar*_*tig 2 python datetime json cherrypy
我正在尝试发送一个记录列表以响应Ajax查询.这种方法很有效,除非结果包含一个日期时间字段,当我的进程因错误而失败时datetime.date(2011, 11, 1) is not JSON serializable
.
我试图将我发现的答案与一个非常相似的问题结合在一起,使用CherryPy文档中的说明来使用自定义的json_out编码器,但我不清楚函数必须具有哪些签名.我写的函数是:
def json_encoder(thing):
if hasattr(thing, 'isoformat'):
return thing.isoformat()
else:
return str(thing)
Run Code Online (Sandbox Code Playgroud)
现在任何使用json_out(即使输出中没有日期时间)也会给我错误TypeError: json_encoder() takes exactly 1 argument (0 given)
.但是如果编码器没有参数,它如何接收要编码的对象?
(另外,我假设我使用str(thing)
的默认编码方法是错误的,这应该通过调用json编码的默认处理程序来完成,但我不知道如何调用该方法).
小智 9
我在类似的情况下做下一个:
class DecimalEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Decimal):
return float(obj)
return json.JSONEncoder.default(self, obj)
Run Code Online (Sandbox Code Playgroud)
并在电话中:
json.dumps(my_variable, cls=DecimalEncoder)
Run Code Online (Sandbox Code Playgroud)
所以在你的情况下它应该是这样的:
class DateEncoder(json.JSONEncoder):
def default(self, obj):
if hasattr(obj, 'isoformat'):
return obj.isoformat()
else:
return str(obj)
return json.JSONEncoder.default(self, obj)
json.dumps(my_variable, cls=DateEncoder)
Run Code Online (Sandbox Code Playgroud)
我遇到了同样的问题(Python 3.2,Cherrypy 3.2.2),我用以下代码解决了它:
import cherrypy
import json
import datetime
class _JSONEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime.date):
return obj.isoformat()
return super().default(obj)
def iterencode(self, value):
# Adapted from cherrypy/_cpcompat.py
for chunk in super().iterencode(value):
yield chunk.encode("utf-8")
json_encoder = _JSONEncoder()
def json_handler(*args, **kwargs):
# Adapted from cherrypy/lib/jsontools.py
value = cherrypy.serving.request._json_inner_handler(*args, **kwargs)
return json_encoder.iterencode(value)
Run Code Online (Sandbox Code Playgroud)
然后你可以使用Cherrypy json_out
装饰器:
class Root:
@cherrypy.expose
@cherrypy.tools.json_out(handler=json_handler)
def default(self, *args, **kwargs):
...
Run Code Online (Sandbox Code Playgroud)