Re: [閒聊] is not JSON serializable

看板Python作者 (←這人是超級笨蛋)時間11年前 (2014/10/07 11:10), 編輯推噓2(205)
留言7則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《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,
b是個MyDateTime物件,json看不懂,所以錯誤
10/07 10:23

10/07 10:24,
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) --

08/10 00:59,
void main(void) 的寫法是可行的唷^^
08/10 00:59

08/10 02:16,
雖然這個寫法較傳統,但是語法與文法都正確哦^^
08/10 02:16

08/10 20:18,
目前我使用的 Visual C++ 都接受 void main(void) 與
08/10 20:18

08/10 20:19,
int main(void),各位可以把 C++ 專案改成原生 C++ 類型來
08/10 20:19

08/10 20:21,
用 void main(void) 來寫發現也可通過編譯.
08/10 20:21

08/11 20:23,
這個就是 Visual C++ 的彈性.
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
to_s確實是從ruby來的,用起來總是比str()習慣XD
10/07 15:06, 2F

10/07 15:21, , 3F
如果是這樣的話我推薦你這個 @property decorator
10/07 15:21, 3F

10/07 15:22, , 4F
加上去之後你連括弧都不用寫了整個都和 Ruby 一樣呢
10/07 15:22, 4F

10/07 15:23, , 5F
說正經的, 還是推薦入境隨俗一下啦, 這樣以後也更好維護
10/07 15:23, 5F

10/08 00:14, , 6F
好奇問一下怎會想從ruby跳過來?XD
10/08 00:14, 6F

01/09 18:30, , 7F
主要是維護之前人寫的扣,個人是比較習慣ruby
01/09 18:30, 7F
文章代碼(AID): #1KCrcpgi (Python)
文章代碼(AID): #1KCrcpgi (Python)