Re: [閒聊] is not JSON serializable
※ 引述《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 )
→
10/07 10:23,
10/07 10:23
→
10/07 10:24,
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)
--
→
08/10 00:59,
08/10 00:59
→
08/10 02:16,
08/10 02:16
→
08/10 20:18,
08/10 20:18
→
08/10 20:19,
08/10 20:19
→
08/10 20:21,
08/10 20:21
→
08/11 20:23,
08/11 20:23
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.94.57
※ 文章網址: http://www.ptt.cc/bbs/Python/M.1412651443.A.AAC.html
推
10/07 15:04, , 1F
10/07 15:04, 1F
→
10/07 15:06, , 2F
10/07 15:06, 2F
→
10/07 15:21, , 3F
10/07 15:21, 3F
→
10/07 15:22, , 4F
10/07 15:22, 4F
→
10/07 15:23, , 5F
10/07 15:23, 5F
→
10/08 00:14, , 6F
10/08 00:14, 6F
推
01/09 18:30, , 7F
01/09 18:30, 7F
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):
Python 近期熱門文章
PTT數位生活區 即時熱門文章