※ 引述《ireullin (raison detre)》之铭言:
: 请问一下
: 我想自订一个方便我自己使用的datetime class
: 可是在序列化为json格式的时候报错
: TypeError: "2014-10-06 17:06:53.743" is not JSON serializable
: 请问我__repr__里头有那里写错吗
: 该怎么修改比较好
: class MyDateTime(datetime.datetime):
: def __str__(self):
: return self.to_s()
: def __repr__(self):
: return json.dumps(self.to_s())
: def to_s(self):
: return '%04d-%02d-%02d %02d:%02d:%02d.%03d' % (
: self.year, self.month, self.day, self.hour, self.minute,
: self.second, self.microsecond/1000.0
: )
: b = MyDateTime.now()
: print json.dumps( b )
→ alibuda174: b是个MyDateTime物件,json看不懂,所以错误 10/07 10:23
→ alibuda174: print json.dumps(str(b))可执行,但是你要的吗? 10/07 10:24
(题外话, 硬要定义一个 to_s 感觉很像 Ruby 转 Python 但习惯转不过来...)
Python 的 JSON serialization 没有用到任何 magic methods
它是用 introspection 实作的, 而且默认不认得 datetime object
因为 JSON 没有表示日期的语法 (虽然习惯上是用 ISO 8601, 但那只是习惯)
所以如果你想要让 Python 认得它, 就要自己扩充默认的 JSON encoder
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
# 如果是 datetime, 把它转成 str
if isinstance(obj, datetime.datetime):
return str(obj)
# 否则沿用默认设定 (会 raise exception)
return super(CustomEncoder, self).default(obj)
然后把 __repr__ 改成这样
def __repr__(self):
return CustomEncoder().encode(self)