Re: [闲聊] is not JSON serializable

楼主: uranusjr (←這人是超級笨蛋)   2014-10-07 11:10:41
※ 引述《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)
作者: GNUGCC (-std=c++14)   2013-08-10 00:59:00
void main(void) 的写法是可行的唷^^虽然这个写法较传统,但是语法与文法都正确哦^^目前我使用的 Visual C++ 都接受 void main(void) 与int main(void),各位可以把 C++ 专案改成原生 C++ 类型来用 void main(void) 来写发现也可通过编译.这个就是 Visual C++ 的弹性.
作者: alibuda174 (阿哩不达)   2013-10-07 10:23:00
b是个MyDateTime物件,json看不懂,所以错误print json.dumps(str(b))可执行,但是你要的吗?

Links booklink

Contact Us: admin [ a t ] ucptt.com