作者uranusjr (←这人是超级笨蛋)
看板Python
标题Re: [闲聊] is not JSON serializable
时间Tue Oct 7 11:10:41 2014
※ 引述《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 )
1F:→ alibuda174: b是个MyDateTime物件,json看不懂,所以错误 10/07 10:23
2F:→ 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)
--
3F:→ GNUGCC:void main(void) 的写法是可行的唷^^08/10 00:59
4F:→ GNUGCC:虽然这个写法较传统,但是语法与文法都正确哦^^08/10 02:16
5F:→ GNUGCC:目前我使用的 Visual C++ 都接受 void main(void) 与 08/10 20:18
6F:→ GNUGCC:int main(void),各位可以把 C++ 专案改成原生 C++ 类型来 08/10 20:19
7F:→ GNUGCC:用 void main(void) 来写发现也可通过编译. 08/10 20:21
8F:→ GNUGCC:这个就是 Visual C++ 的弹性.08/11 20:23
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.112.94.57
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/Python/M.1412651443.A.AAC.html
9F:推 ireullin: 谢谢您的回答,我再试试看 10/07 15:04
10F:→ ireullin: to_s确实是从ruby来的,用起来总是比str()习惯XD 10/07 15:06
11F:→ uranusjr: 如果是这样的话我推荐你这个 @property decorator 10/07 15:21
12F:→ uranusjr: 加上去之後你连括弧都不用写了整个都和 Ruby 一样呢 10/07 15:22
13F:→ uranusjr: 说正经的, 还是推荐入境随俗一下啦, 这样以後也更好维护 10/07 15:23
14F:→ hcmlinj: 好奇问一下怎会想从ruby跳过来?XD 10/08 00:14
15F:推 ireullin: 主要是维护之前人写的扣,个人是比较习惯ruby 01/09 18:30